news 2026/10/13 9:16:02

中国地震动峰值加速度区划图SHP矢量化与ArcGIS应用全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
中国地震动峰值加速度区划图SHP矢量化与ArcGIS应用全解析

简介:这份压缩包提供的是中国地震动峰值加速度区划图的矢量边界成果,面向GIS从业者、地震工程与城市规划人员,将栅格形式的地震动峰值加速度数据转换为标准Shapefile格式,便于在ArcGIS、QGIS等软件中直接进行空间查询、叠加分析和可视化表达。包体共8个文件,包含.shp几何数据、.dbf属性表、.prj坐标系定义及.shx索引等完整组件,压缩包整体仅1.15MB,结构精简易于分发。目前已有3412人浏览学习。矢量化后的成果以面要素表征不同峰值加速度分区,用户可快速提取全国范围的地震动参数,结合人口、建筑、基础设施等图层开展灾害风险综合评估,也可用于确定不同区域的抗震设防要求。较之原始栅格数据,该成果占用空间更小,查询与制图效率更高,是地震灾害管理与科研分析的基础工具。

1. 中国地震动峰值加速度区划图:能进 ArcGIS 直接分析的 SHP 矢量成果

做工程场地地震安全评价、建筑选址或者城市防灾规划时,第一步往往卡在数据上:手头拿到的中国地震动峰值加速度区划图不是纸质扫描件,就是像素很低、没有地理配准的栅格图片。在 ArcGIS 里想叠个场地边界、提个分区数值,根本无从下手,更别说做缓冲区分析或者面积统计了。这份「中国地震动峰值加速度区划图 shp 文件矢量化成果」解决的就是这个痛点——把 GB18306-2015《中国地震动参数区划图》里的峰值加速度分区(0.05g 到 0.40g)从图纸变成了可编辑、可查询、可叠加的矢量多边形图层。适合结构工程师、地震安评人员、GIS 数据处理岗,也适合高校里做灾害风险评估课题的学生。有了这份 shp,你不用再对着扫描图描线,直接加载就能做空间分析和出图。

2. 成果数据拆解:坐标系、属性表与 GB18306-2015 的对应关系

拿到压缩包先别急着往 ArcMap 里拖,先花十分钟把文件清单和属性结构看清楚。这一步省下来的时间,比后面踩坑再返工多得多。

2.1 文件清单与坐标系:先搞清楚投影再打开

压缩包解压后,标准的 shapefile 一套是四个文件打底:.shp(几何)、.dbf(属性)、.shx(索引)、.prj(投影信息)。部分配套可能还有 .cpg(字符集)和 .sbn/.sbx(空间索引)。这套文件缺一不可,拷贝的时候只拿一个 .shp 过去,对方电脑上大概率显示不了。

最关键的是 .prj 文件。这份成果我建议你先用文本方式打开 .prj 看一眼坐标系描述。常见有两种情况:一是 CGCS2000 地理坐标系,单位是度,适合全国范围浏览和经纬度查询;二是高斯-克吕格投影坐标系,单位是米,CGCS2000 3-degree Gauss-Kruger zone 某某,适合做距离量算和面积统计。两种坐标系没有绝对好坏,但混用就会出大问题——把投影坐标当经纬度画图,图形会偏到完全对不上。

我一般拿到数据后会做两步快速体检。第一步,用 ArcGIS 的 ArcToolbox 里 Data Management Tools -> Projections and Transformations -> Define Projection,确认 .prj 描述和元数据一致。第二步,打开属性表看一条记录,对照它的坐标值范围:天文经纬度在 73 到 135 之间、纬度在 3 到 54 之间;如果出现上百万的数字,那基本就是投影坐标。用 Add XY Coordinates 工具跑一遍也能快速确认范围分布。这一步别偷懒,矢量化数据最怕坐标系定义错了还硬着头皮往下做。

2.2 属性表结构:PGA 值与分区代码怎么对应

这份矢量化成果的属性表,核心字段各家的命名有差异,但万变不离其宗,通常包含以下内容:

字段名(常见)类型含义示例
NAME / ZONENAMEText分区名称或编号VII度区、0.10g区
PGA 或 PGA_VALUEDouble峰值加速度设计值0.05、0.10、0.15、0.20、0.30、0.40
CODE / GB_CODEText对应的国家标准编号逻辑Ⅱ1、Ⅱ2 等
LANDAREA 或 AREADouble多边形面积(需投影坐标计算)123456.78

需要强调一点:国标 GB18306-2015 的规定里,峰值加速度分档是 0.05g、0.10g、0.15g、0.20g、0.30g、0.40g 这六档。如果你在属性表里看到的是 0.10 而不是 0.10g,不用觉得奇怪,很多矢量化为了字段好计算,直接把 g 单位省略了。但你在做展示标注或者导出到文档时,记得把单位补回去,否则看图的人会困惑:0.10 到底是秒还是什么?

另外有一个容易被忽略的字段是抗震设防烈度。老规范里大家习惯说烈度(7 度、8 度),GB18306-2015 之后主推峰值加速度和反应谱特征周期双指标。好的矢量化成果会在属性表里同时保留 PGA 和对应的烈度参考值,方便不熟悉新规的同事做对照。如果你拿到的这份表里没做烈度对照,自己按对应关系加一列就行:0.05g 对应 VI 度,0.10g 对应 VII 度,0.15g 对应 VII 度半,0.20g 对应 VIII 度,0.30g 对应 VIII 度半,0.40g 对应 IX 度。

2.3 与栅格原图的差异:边界平滑度和精度分级

矢量化成果和原图之间,一定会存在边界差异,这是由矢量化工艺决定的。原图如果是纸质扫描,图纸本身有变形,扫描后还有倾斜误差。ArcScan 的自动追踪会在栅格边缘提取中心线,肉眼看着贴边,但放大到 1:50000 以上就能看出台阶状锯齿。这套成果如果是半自动矢量化,人工补线的部分边界会更顺;如果全程自动追踪,锯齿感会明显一些。

对工程应用来说,这个误差可接受吗?分情况。做城市级别的防灾规划,1:10 万甚至 1:25 万比例尺下,锯齿边界完全不影响结论。但如果要做某个县、某个园区的精确场地评价,需要和场地边界求交、算面积占比,那就要留意了。建议你先用 Smooth Polygon 工具做一次平滑处理,容差设 100 米到 500 米之间,PGA 分区的宏观边界是足够稳定,不会出现分区性质改变。切忌容差设太大,比如超过 2000 米,会把原本独立的 0.15g 飞地直接吞掉。

精度分级一般分两级:主干边界(如 0.20g 与 0.15g 的分界线)和次级边界(如局部异常区、飞地)。主干边界误差距在图上 0.5 毫米以内,次级边界可能到 1 毫米。对于 1:400 万小比例尺的全国图,这个精度够用;对于大比例尺精细分析,只能当作参考底图,不能当作实测边界。

3. ArcScan 矢量化思路复盘:自动追踪加手动补线的工作流

如果你不是只想用现成数据,而是手里有一张扫描版区划图想自己矢量化,那么这套 ArcScan 流程可以直接抄作业。就算你只是好奇这份成果是怎么做出来的,看完这一步也能明白它的精度边界在哪里。

3.1 栅格清理是第一步:二值化阈值决定一切

ArcScan 有个前提:它只认二值化栅格(像素值只有 0 和 1)。彩色扫描图进去先要转成灰度,再做重分类或栅格清理。这一步你没做对,后面自动追踪出的线大概率是断的或者歪的。

实操路径是:ArcToolbox -> Spatial Analyst Tools -> Reclassify -> Reclassify,把灰度值的 0 到 255 区间按阈值一分为二。关键参数有两个——分类阈值和像元大小。阈值怎么给?我一般用影像本身的直方图找波谷:如果线划是黑色,背景是白色,直方图会在低值段(比如 20 到 80)聚集,背景高值段聚集,波谷位置就是阈值。设定在波谷偏右一点,保证线划不被断裂。

# 以 ArcPy 方式执行重分类,阈值分割灰度栅格 import arcpy from arcpy.sa import * # 输入扫描灰度图 in_raster = "scan_zone.tif" # 阈值设为 80,所有像元值低于 80 记为 1(线划),其余为 0(背景) remap = RemapRange([[0, 80, 1], [80, 255, 0]]) out_raster = Reclassify(in_raster, "Value", remap, "NODATA") out_raster.save("clean_binary.tif")

这里的逻辑是:所有像元变成 0 或 1 后,ArcScan 才能识别“哪些像元是线,哪些是空白”。阈值给低了,区域边缘的浅色线直接消失;阈值给高了,噪声点全部变成伪线。像元大小方面,扫描分辨率如果是 300 DPI,在 GIS 里重建的像元尺寸不要小于原图分辨率,否则纯粹是白算。

做完重分类后,ArcScan 工具栏里还要做一步 Essential 操作——栅格清理。点一下 Raster Cleaner,用 Clean Cells 里的开运算先把零散噪声点去掉。这一步处理完,二值图上的线划应该呈连通状态,没有断点,才能进入下一步自动追踪。

3.2 自动矢量化参数:最大线宽、最小宽度与平滑容差

ArcScan 的 Raster To Polyline 工具有一组参数直接决定输出线的质量:最大线宽(Maximum Width)、最小宽度(Minimum Width)、平滑容差(Smoothing Tolerance)、不连续跳跃容差(Gap Tolerance)。

通道宽度怎么设置?区划图的分区边界线在扫描图上通常是 0.2 毫米到 0.5 毫米粗,换算成栅格像元,300 DPI 下大约 3 到 6 个像元。最大线宽设 10 个像元足够,设太大(比如 20)会把相邻的分区边界并成一条线。最小宽度设 2 或 3,小于这个宽度的孤立像素会被忽略,避免把图斑里的文字轮廓也当成线。

不连续跳跃容差是 ArcScan 里最玄学的一个参数。它指的是自动追踪时允许跳过多大距离的断口继续连线。默认 1 个像元基本只能接极小的断口,我一般调成 5 到 10 个像元。但注意,这个值越大,越容易把本不该相连的两个不同分区边界串起来。如果发现追踪结果里出现不该有的横向连线或者串区,优先把它调回 2 再重新跑。

# ArcPy 调用矢量化工具,输出面要素前先生成线 out_lines = "auto_trace_lines.shp" arcpy.arcscan.RasterToPolyline( in_raster="clean_binary.tif", out_polyline_features=out_lines, maximum_width=10, minimum_width=3, smoothing_tolerance=8, # 平滑容差越大边界越光滑,但细节损失越多 gap_tolerance=5, simplify="SIMPLIFY" )

跑完之后别急着转面,先打开属性表看看有多少条线。按经验,自动追踪结果中会有大约 15% 到 25% 的错误线——要么是弯曲过度的伪线,要么是断成几截的碎线。这些都要在半自动阶段修掉,不能在自动阶段指望一次成型。我需要强调一遍:ArcScan 的自动矢量化定位是帮你完成 70% 的机械劳动,剩下 30% 必须人肉收尾。这一点任何做过的工程师都会认同,网上那些说全自动一把梭的教程基本没做过大批量生产。

3.3 半自动跟踪:复杂分区的强制断线与手工连接

自动追踪完成后,推荐用 ArcScan 的 Vectorization Trace 工具(半自动追踪)做逐段修正。工作流是:选一条断裂的线作为起点,点击 Trace 按钮后 ArcGIS 会沿着二值栅格的中心线自动延伸,遇到分叉或灰度变化就停下。这时候用编辑工具里的 Cut Polylines 手动打断错误连接,用 Merge 或者 Auto Complete Polygon 把正确的线首尾相接。

实际场景里最容易翻车的是 0.15g 和 0.20g 的交界区域。这些区域在扫描图上有大量锯齿状过渡,自动追踪会生成大量回形针式的细小摆动。我的做法是把视图放大到 1:2000,对每次转折的人工判断标准定为“是否改变 PGA 分区的几何归属”。如果只是图上轻微摆动、不改变两侧分区属性,直接简化掉;如果改变归属,必须保留控制点。最后用 Generalize 工具做一次 Douglas-Peucker 抽稀,容差设 5 米到 10 米,既能去掉微观锯齿,又不影响分区宏观形态。这一步结束,得到的线图层再经由 Feature To Polygon 生成面要素,矢量化主体完工。

4. 从 SHP 出发做格式转换:KML、MapGIS 线文件与 3D Tiles

数据本身是 shp,但在实际协作中,你可能要把它送给规划院(用 ArcGIS)、发给做三维展示的团队(要 3D Tiles)、或者给地质队的老工程师(非 MapGIS 不可)。格式转换因此成了刚需。这一章我按三种最常见的下游需求分别讲参数和坑。

4.1 shp 转 KML:简化容差与名称字段的取舍

KML 是 Google Earth 和各类在线地图平台的通用格式。ArcGIS 的 Layer To KML 工具用起来不复杂,但有两个参数直接影响文件体积和显示效果:Layer Output Scale 和 Simplification Tolerance。前者决定图层的细节层级,后者决定几何简化的力度。

默认的 Simplification Tolerance 为 0,意味着不简化,整个全国分区图转出来的 KML 可能超过 50MB,打开时卡成幻灯片。我的经验值是设成 0.001 到 0.005(单位由源数据坐标系决定),既能保住省级分区的宏观轮廓,又能显著缩小文件体积。

# 用 ArcPy 把面图层导出为 KML import arcpy # 简化容差:0.002度(约200米),避免KML文件爆炸 arcpy.LayerToKML_conversion( in_layer="pga_zones.shp", out_kml_file="pga_zones.kmz", layer_output_scale=50000, is_composite="COMPOSITE", boundary_box="", size=2048, dpi=96, simplify_tolerance=0.002 )

输出的 KMZ(压缩后的 KML)通常比原 shp 小一半以上。如果你要的是纯 .kml 而不是 .kmz,把压缩包后缀改成 kmz 再解压出来也行,或者用 QGIS 的 Save As 直接选 KML 格式。名称字段方面,KML 的弹窗标题默认取属性表第一个字符串字段,建议先把 NAME 字段移到第一位再转,否则弹窗显示的是 OBJECTID,没有辨识度。另一个坑:KML 不支持中文属性字段名,出图时中文名会变成问号。解决方法是先在属性表里 Create Field 一个英文别名,比如 PGA_val,赋值后再导出。

4.2 shp 转 MapGIS 线文件:属性挂接与线型丢失

地质和地震系统里,MapGIS 的使用率仍然不低。shp 转 MapGIS 线文件,最常见的路径是先用 ArcGIS 把面要素转出边界线(Feature To Line),再通过 MapGIS 的“外部数据转换”模块导入。直接拖 .shp 进 MapGIS 不是不行,但经常出现线型弧段缺失、属性字段错位的问题。

我的建议是转之前做两步预处理。第一步,把面转线,并且用 Dissolve 按 PGA 字段融合,避免同一条边界被多个面要素的弧段重复覆盖。第二步,在属性表里只保留你真正需要的字段(NAME、PGA_CODE),其余全部 Delete Field。MapGIS 对字段数量的兼容性没有 ArcGIS 好,字段多了导入后经常出现表结构错乱。

MapGIS 转换时注意坐标系同名定义。MapGIS 的投影参数和 ArcGIS 的 .prj 描述不是一一对应的,最稳妥的方式是先在 MapGIS 里新建一个与源数据同系的空间参照,再导入要素时直接指定。我见过太多人忽略这一步,导致导入后图形正常,但空间分析功能一算距离就偏出几十公里。

4.3 shp 转 3D Tiles:给分区赋高程后的轻量化方案

如果你要的是三维场景展示,比如把区划图叠加到 DEM 或者倾斜摄影模型上,shp 转 3D Tiles 是目前比较主流的需求。但注意:3D Tiles 面向的是三维瓦片,普通的平面 shp 不能直接转,必须先给每个面要素赋予高度属性。

常用做法是 ArcScene 里 Extrude Between 工具把面要素按 PGA 值拉伸成体块,再导出成 3D Feature Class,最后用 Cesium 的 ion 平台或开源工具(如 obj23dtiles、py3dtiles)做格式转换。拉伸高度怎么选?如果只是可视化,我建议高度设成 PGA 值乘以 1000——比如 0.10g 拉伸 100 米,0.40g 拉伸 400 米。这样你在三维场景里一眼就能看出高风险区的位置和范围。

// 以 Cesium ion 的 API 为例,上传转换好的 3D Tiles 后在场景中加载 const tileset = await Cesium.Cesium3DTileset.fromUrl( "https://your-server.com/tileset/pga_zones_3dtiles.json" ); viewer.scene.primitives.add(tileset);

需要留意的是,拉伸处理只改变视觉表达,不改变原始 shp 数据本身。如果你后续还要做面积统计、空间查询,务必要保留原始面文件,不要在三维数据上做空间分析。两个数据用途不同,混为一谈是常见误区。

5. 避坑排查:矢量化成果里最常见的 4 个现场问题

这份数据我在实际项目里用过几次,也帮同事排查过若干次问题。下面这些问题如果在你的加载和分析环节出现了,可以直接按对应步骤解决。

5.1 边界不闭合:拓扑错误导致面积统计缺失

现象:用 Calculate Geometry 算面积时,部分多边形返回空值或 0,没有报错,但结果明显不对。

原因:矢量化过程中,线转面时有些边界没有完全闭合,Feature To Polygon 生成的是开放线而不是完整面。开放要素在拓扑上不能被识别为 polygon,面积统计自然失败。

解决:先用 ArcToolbox 里的 Check Geometry 跑一遍,看返回的拓扑错误类型。然后对报错的要素用 Repair Geometry 工具修复。Repair Geometry 能自动填充微小缝隙并闭合边界,处理过后再次运行 Check Geometry 确认错误清零。需要说明:Repair Geometry 不是万能药,如果边界本身缺失一整段弧线,修复填补的是一条直线,你就需要用编辑工具手动补上那一截。

5.2 相邻分区互相压盖:重叠多边形与属性冲突

现象:加载多个分区的 shp 后,放大检查发现相邻分区有部分重叠区域,叠着两层不同的 PGA 值。

原因:矢量化时两条相邻边界都被人工描过,没有使用公共边对齐,导致弧段交叉。这种情况在两侧分区各自由不同操作员手工绘制时很常见。

解决:用 Union 工具(Analysis Tools -> Overlay -> Union)把所有分区合成一层,Union 生成的接缝处如果有重叠,会自动把重叠部分切成独立小面。然后对每个小面按面积取主 PGA 值——哪个分区面积占优就归哪个。最后用 Dissolve 按 PGA 字段融合,边界就干净了。

5.3 坐标系错套:在高斯投影下画经纬度坐标

现象:把某个县界 shp 与区划图叠加后,图形整体偏移 200 到 500 米,旋转角不大但对不齐。

原因:两个图层的坐标系不一致,一个是 CGCS2000 投影坐标(单位米),另一个是独立坐标系或者 WGS84 地理坐标,没有做动态投影转换就直接叠加。

解决:右键图层属性 -> Source 标签页查看各图层坐标系,确认后使用 Project 工具(Data Management -> Projections and Transformations -> Feature -> Project)把区划图投影到与底图一致的新坐标系。注意别用 Define Projection 强行覆盖,那是修改元数据而不是做坐标变换,乱用会把本来正确的数据改坏。投影参数选择上,新坐标系如果是高斯-克吕格,要确认带号和中央经线。全国范围的图不适合转单一高斯平面,建议 3 度分带,按省份跨的带号选邻近带。比如四川涉及 105 度带和 108 度带,直接全图转 105 度带会导致边缘区域拉伸变形,看起来像数据坏了,实际是带号没选对。

5.4 属性值与标准不符:0.05g 和 0.05 只差一个单位标注

现象:统计不同 PGA 分区的面积占比时,发现 0.15g 分区面积异常大,和原图目测不符。

原因:属性表里部分记录的 PGA 值是 0.15,另一部分记录的是 1.5——小数点在矢量化录入时打错了位置。还有可能是 0.10g 和 0.1 混用,在 disslove 时被分成了两类,各自统计。

解决:加一个判断字段,用 Select By Attributes 筛出可疑记录。比如 PGA 值列表中只应有 0.05、0.10、0.15、0.20、0.30、0.40 这六档,用字段计算器检查有没有不在此范围的值。发现异常值后按相邻分区的属性插值或者对照原图人工判断修正。写一个 ArcPy 脚本批量校正也可以,但前提是先筛选出异常记录再改:

# 对可疑 PGA 值做修正:错位的倍数关系按就近原则归位 import arcpy fc = "pga_zones.shp" valid_values = [0.05, 0.10, 0.15, 0.20, 0.30, 0.40] with arcpy.da.UpdateCursor(fc, ["PGA_VALUE"]) as cursor: for row in cursor: val = row[0] # 值大于0.5的基本是录入错误,除以10归位 if val > 0.5: row[0] = val / 10 # 值为0直接置空待手工处理 elif val == 0: row[0] = None cursor.updateRow(row)

修正过后马上重跑一次面积统计,并且和原图分区目视抽查,别只依赖脚本。属性错误是最隐蔽的数据质量事故,面转出来全是对的,可结论却南辕北辙,务必要查。

6. 最后一道手续:拓扑修复加叠加验证的出厂检查

数据拿到手,配准做完,格式也转换顺畅了,这时要做一轮出厂级验证,目的是确认它确实能直接进入工程分析流程。我会做三件事:拓扑检查、与影像底图叠加比对、面积占比抽验。

拓扑检查跑一遍 ArcToolbox 里的 Topology 工具集,重点检查 Must Not Overlap 和 Must Not Have Gaps 两条规则。四处转一圈,发现不达标的面及时修复。叠加比对是把区划图叠到在线影像底图上,随机抽 10 个分区的边界目视检查,确认没有整体偏移和局部扭曲。面积占比抽验针对你项目的重点区域:比如目标场地落在 0.20g 分区,把该场地边界要素和区划图求交,算交集面积占比,占比超过 95% 说明数据精度对本次工程足够,低于 85% 就要考虑找更大比例尺的测绘成果来做场地评价。

这三项验证做完,这份数据才算是真正进了你的可信数据池。我个人的习惯是验证过程中顺手出一张截图和一个属性表统计文本,命名带日期和校验人缩写,归档在数据源目录下。从那以后,我每次拿到外部栅格或矢量数据,都会强制走一遍这套出厂检查,哪怕对方承诺处理过——里面的原因很现实,矢量化数据经过多次传递后,真正的问题往往出在对方不知道的坐标系偏移或者某个弧段的微小缺口上。希望这份拆解和检查流程,帮你在做抗震分析时少走一遍我走过的弯路。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 9:15:30

风电-水电联合优化运行模型复现与工程实践

1. 项目背景与核心价值风电-水电联合优化运行是当前新能源消纳领域的热点研究方向。我国西部地区的风电资源丰富,但风电出力具有显著的随机性和波动性,而水电则具备良好的调节性能。将两者联合运行,既能提高风电消纳率,又能优化水…

作者头像 李华
网站建设 2026/10/13 9:14:54

SpringBoot+Vue商品管理后台系统架构设计与实践

1. 项目背景与核心价值零售行业数字化转型浪潮下,商品管理后台系统已成为企业运营的神经中枢。这个基于SpringBoot的商品管理后台系统,正是为解决中小型零售企业运营痛点而设计的全栈解决方案。我在实际电商系统开发中发现,传统单体架构的管理…

作者头像 李华
网站建设 2026/10/13 9:13:00

背靠背5MW海上永磁风电并网仿真:架构、控制与调试

一直有读者拿着“背靠背5MW海上永磁风力发电并网仿真”这个题目来找我,说模型跑不稳、控制框图看不太懂,或者刚拿到一个仿真包不知道从哪下手。这个题目看起来就是一行字,背后其实是三块内容叠在一起:永磁同步电机的数学模型、两个…

作者头像 李华
网站建设 2026/10/13 9:12:15

SVM算法复杂度全解析:从核技巧到工程优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 9:11:22

纯前端商城系统实战:HTML5+JavaScript+CSS购物系统全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华