ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GIS图层重叠区域提取三招:按位置选择、相交与空间连接

GIS图层重叠区域提取三招:按位置选择、相交与空间连接 干GIS这行的最烦的不是数据量大而是数据就在眼前可要的那部分偏偏被别的图层压着、叠着、盖着。我在实际项目里被重叠区域提取这件事折磨过太多次了——两个图层叠加之后到底怎么把重叠的部分干净利落拿出来是一块一块手动勾还是复制粘贴再修都不是。这篇博文我就把压箱底的三招掏出来专门解决这个问题。不管你是做国土空间规划、灾害评估、选址分析还是日常处理宗地与地类叠加这三招都能让你少走弯路。内容以ArcGIS 10.2为例但思路和参数对其他GIS平台同样适用。1. 动手之前先想清楚你要提取的是哪种重叠很多人在提取重叠区域时翻车不是操作不会而是从一开始就没想明白自己要的到底是哪种叠加关系。这一步想清楚了后面工具选型、参数设置全都可以顺下来。1.1 两类重叠不能混为一谈空间重叠与要素压盖我见过不少新手把空间重叠和要素压盖当成一回事跑来问我为什么按位置选择选出来的东西不对。其实这两类诉求差别非常大处理思路完全不一样。第一类是图层与图层之间的空间重叠。比如你有某个区域的土地利用现状图又有一份生态保护红线图需求是把落在生态红线范围内的耕地全部找出来。这种情况是两个独立图层发生空间关系你要做的是基于位置做判断找到A图层中哪些要素和B图层发生了交集或者在B内部、或与B压盖。第二类是单个图层内部要素之间的压盖。最常见的就是同一面图层里出现了重叠面比如规划地块互相叠压、用地报批范围有重复。这种情况做提取时重点不是找关系而是做修复和按规则取舍——要么按面积最大优先保留要么按字段优先级去重甚至需要做拓扑修复。这两种情况对应的处理工具完全不同。图层之间重叠用按位置选择、相交、空间连接图层内部重叠则需要拓扑检查、消除重复面或者用融合加统计字段来去重。所以我一再强调动手前先判断一下我刚才说的这三招全部是针对第一种情况——图层与图层之间的重叠区域提取。1.2 数据处理前的三个硬性检查坐标系、拓扑、字段类型方向定了先别急着点工具。我在实际工作中总结出三个硬性检查每一项都可能让后续操作直接翻车。第一个检查坐标系是否统一。这不是小问题——我见过有人把一个WGS84坐标的图层和一个CGCS2000投影坐标的图层直接叠加结果提取出来的重叠区域跑到城市另一端去了。ArcGIS虽然会自动做动态投影显示但参与分析时如果坐标系不一致结果就可能出错。你可以在图层属性里确认坐标系也可以在ArcToolbox里用投影工具把数据统一到同一坐标系再操作。如果你不确定哪个坐标系合适就按数据用途来做精确面积计算、距离量算用投影坐标系如CGCS2000 / 3-degree Gauss-Kruger更靠谱做全球范围展示用地理坐标系就够了。第二个检查要素是否干净。所谓干净就是要素不能有自相交、重复节点等拓扑错误。尤其是做相交操作时数据里一旦有拓扑错误输出结果经常会出现面积为零的碎面或者莫名其妙的空要素。我的习惯是先跑一遍修复几何Repair Geometry把几何错误清干净再进分析流程。第三个检查字段类型是否符合预期。比如你打算做字段计算对重叠区域算面积就得确保面积字段是双精度Double而不是字符串。再比如你要按行政代码做关联那连接字段的类型和长度最好在原始表里就统一好否则后面空间连接时匹配不上你根本不知道哪里出了问题。磨刀不误砍柴工这三项检查五分钟能搞定却能帮你省下后面两个小时的排错时间。2. 第一招按位置选择——不生成新数据也够用按位置选择是我日常使用频率最高的一个功能没有之一。它解决的是哪些要素落在另一个图层的范围内这类的判断问题最适合在不需要生成新图层、只想快速筛选结果时使用。最重要的一点是它不会修改原始数据只输出一个临时的选择集。2.1 按位置选择到底做了什么按位置选择的原理很简单它通过空间关系运算符比如相交、包含、位于内部等来判断两个图层之间的要素关系然后把符合条件的源图层要素选中。你可以在ArcGIS 10.2的菜单栏选择→按位置选择里打开它。我用的最多的有四种关系intersect相交只要源要素与目标要素在空间上有任何重叠哪怕只是边角碰了一下也会被选中。适用于大多数压盖即算的场景。are within完全位于内部源要素必须完全被目标要素包含。适合提取如水系完全在保护区内部这类严格要求。contain包含目标要素完全在源要素内部适合选出包含某点的面要素。are crossed by the outline of边界穿越适用于线和面的空间关系比如选出穿过地块的输电线路。你可能会问这不是选择吗和提取有什么关系关键就在最后一步选中结果后可以右键图层→数据→导出数据把选择集导出成一个新的要素类。这一步才是提取完成的标志。而且因为选择集是临时的你还可以不断调整条件重新选择直到满意为止整个过程不会污染原始数据。2.2 实操步骤从选区到导出一次走通我拿一个实际案例演示一下完整流程。去年有个项目需要从全县的地块数据里提取出所有与饮用水水源保护区重叠的地块用于环保合规性排查。第一步在内容列表里同时加载地块和水源保护区两个图层。第二步打开按位置选择目标图层选水源保护区源图层选地块方法选intersect点击确定。这时候地块图层里所有与保护区沾边的地块就高亮显示了。第三步右键地块图层选择数据→导出数据导出范围选择所选要素指定输出路径点击保存。导出完成后在内容列表中勾选新生成的图层原来的地块图层取消勾选你就会看到输出结果只保留了那些与保护区重叠的地块每个要素的几何范围依然是完整的地块范围。这里要注意这个方法得到的结果是完整的地块而不是重叠的那一小块。如果你需要的是重叠部分的精确几何边界比如说要算保护区里有多少面积的地块违规了那这一招就不够了得用下一章说的相交工具。2.3 这招的局限性与规避办法按位置选择最大的优点是不产生中间数据、不破坏原始数据但它有两个明显局限。第一个局限刚才已经说了它不会对几何做切割。按位置选择选出来的要素几何形状和原图层完全一样。在很多场景下这就够了比如哪些房子在洪水淹没范围内你要的是房子本身不是被淹的部分。但如果问题是淹没范围内到底覆盖了多少房屋面积就必须实打实把重叠的那块多边形切出来只能用相交。第二个局限是性能问题。当源图层要素数量达到百万级以上时按位置选择的计算速度会明显变慢有时候还会出现“未响应”的情况。我在处理全县高精度地类图斑时深有体会动辄几十万甚至上百万个图斑处理时建议先按区域分块或者在地理数据库里建空间索引。ArcGIS要素类的空间索引一般默认建立但如果你用的是CAD转过来的数据导入后最好先重建空间索引再操作。还有个小坑如果你在目标图层处于编辑状态时做按位置选择有可能会碰到“无法导出所选要素”的情况。这时候只需要退出编辑状态再重新执行导出问题就解决了。这个坑我踩了不只一次。3. 第二招相交Intersect——把重叠区域真正切出来当你需要的不只是哪些要素重叠而是重叠部分的具体边界和面积时相交工具就是最适合的选择。相交工具会把输入图层的所有要素两两计算交集并输出一个全新的要素类这个要素类里的面就是所有图层重叠的部分。3.1 相交工具的输出规则与参数设置ArcGIS的相交工具在ArcToolbox→分析工具→叠加分析→相交里。这个工具有几个关键参数我一个个说。第一个是输入要素。可以输入两个或两个以上的图层系统会计算所有输入图层的公共交集。当输入超过两个图层时输出的就是这些图层的公共重叠区域。这个特性在多图层叠加提取时尤其好用比如同时叠加生态红线、基本农田、水源保护区你能一次得到三个图层重叠的区域。第二个是输出要素类。你可以指定输出路径和名称输出类型取决于输入的最简单的几何类型。比如输入全是面要素输出就是面如果同时输入线和面输出结果是线。如果你同时输入点线面三种要素输出的就分别是点、线、面的数据集这个规则需要留意以免后期整理时找不到结果。第三个是连接属性JoinAttributes。这个参数决定输出要素中保留哪些输入图层的属性。我一般选ALL这样所有输入要素的属性都会保留方便追溯每个重叠面来自哪个源要素。但如果你处理的图层字段特别多输出表字段会变得又长又乱为了减小数据体积也可以只选要素ID。第四个是XY容差XY Tolerance。这是很多人容易忽略的参数。它决定了在多大距离范围内的几何会被视为同一个点。容差设置得太大细碎的小多边形会被合并掉面积计算精度下降设置得太小又容易产生极细长的碎面。默认容差一般够用但如果你做的是厘米级的高精度分析建议按数据精度手动设置一个合理值。3.2 实战案例多图层叠加提取受灾影响范围我给你还原一个真实操作场景。某次洪水灾害评估要快速提取出洪水淹没范围内受灾的房屋、道路和耕地并统计各类受灾面积。数据准备洪水淹没范围面图层、房屋面图层、道路线图层、耕地面图层。四个图层的坐标系统一为CGCS2000高斯投影。操作步骤打开相交工具输入要素依次添加洪水淹没范围、房屋、道路、耕地四个图层输出要素类设置为受灾影响评估连接属性选ALL点击确定。工具跑完后打开输出图层的属性表你会发现每条记录都带有原始四个图层的属性信息比如这条记录既带有洪水淹没范围的深度字段又带有房屋的权属字段。这就说明这个面是洪水范围房屋的重叠区域。再给输出图层添加一个面积字段用计算几何算出每个重叠面的面积然后按地类字段汇总就能快速得到房屋受灾面积、道路泡水长度、耕地过水面积等关键数字。整个流程从数据准备到结果汇总熟练的话十分钟搞定。我以前没有用相交工具时是先裁剪再拼接步骤繁琐还容易丢属性跟这个方法完全没法比。3.3 性能优化与常见报错排查相交工具好用但对电脑性能有一定要求。我在处理大面积高精度的数据时经常遇到工具运行到一半卡死的情况。这里分享几个亲测有效的优化技巧。第一尽量缩小参与计算的数据范围。先用按属性选择或裁剪工具把输入数据限制在工作区范围内而不是让整个县的数据都参与计算。比如做洪水影响评估时可以先用洪水范围做一下缓冲把缓冲范围内的房屋、道路、耕地裁剪出来再做相交这样参与计算的数据量会大幅下降工具运行速度快得多。第二分批次计算。如果你必须处理超大范围的数据不要一次输入所有图层而是先两两相交得到中间结果后再用中间结果与下一个图层相交。这样每一步的计算量都相对可控出问题了也好排查是哪两个图层造成的。第三检查输入数据的拓扑错误。我在工作里最常遇到的相交报错是999999错误或坐标或测量值超出范围这种情况十有八九是输入要素存在几何错误。处理方法是先对每个输入要素执行修复几何工具然后再跑相交。修复几何会删除短弧、自相交等错误但不会改变要素的整体形状和位置可以放心使用。另外提醒一句相交工具运行完成后最好花十几秒检查一下结果里有没有面积为0或面积特别小的碎面。出现碎面的原因一般是XY容差设置太大或源数据中本就存在微小缝隙。碎面对后期面积统计影响很大我一般直接用按属性选择删除面积小于1平方米的图斑来清理。4. 第三招空间连接Spatial Join——按重叠关系批量汇总统计前两招解决的都是提取什么几何的问题而实际工作中还有一类更棘手的需求不只要提取重叠区域还要把重叠关系变成统计数据。比如统计每个行政区范围内有多少个POI点、每段道路两侧500米内有多少栋建筑。这时候就该空间连接登场了。4.1 空间连接的两种典型用法空间连接Spatial Join的本质是把属性从连接要素附加到目标要素上而这种附加关系的判定规则是空间位置关系。也就是说它不是靠字段值匹配而是靠在空间上是否重叠、是否靠近来匹配。它在ArcToolbox中的路径是分析工具→叠加分析→空间连接同时右键目标图层选择连接和关联→连接也能看到空间连接的入口。第一种典型用法是一对一或一对多关联。比如你有小区面图层和学校点图层需求是给每个小区挂接最近的学校名称。这时目标要素选择小区连接要素选择学校匹配选项选择CLOSEST最接近系统会自动为每个小区找到空间距离最近的学校并把学校名称字段添加到小区属性表中。第二种典型用法是批量统计汇总。同样是小区和学校如果要统计每个小区周边2公里范围内有几所学校目标要素选小区连接要素选学校匹配选项选INTERSECT然后右键连接字段选择求和mergeRule选SUM系统就会统计每个小区2公里缓冲区内的学校数量。这一招在POI密度分析、商业选址、公共设施可达性研究中应用非常广泛。4.2 实操案例给每个小区挂接最近的学校和商圈我拿一个商业选址项目为例详细走一遍流程。当时客户给了一份全市的小区面数据和一份大型商圈点数据要求给每个小区找出距离最近的商圈并计算出距离值。打开空间连接工具目标要素选择小区图层连接要素选择商圈图层输出要素类命名为小区_最近商圈。在连接操作上选择JOIN_ONE_TO_ONE意思是每个目标要素只保留一条连接结果这是最常用的选项。如果选JOIN_ONE_TO_MANY每个小区会对应多条记录适合做清单而不是做挂接。匹配选项选择CLOSEST系统会自动找到每个小区空间最近的商圈。点击字段映射在这里你可以去掉一些不需要的字段减少输出属性表的字段数量。最后点击确定。跑完后打开小区_最近商圈的属性表你会发现每个小区对应的那条记录里已经有了商圈名称字段和代码字段。但如果客户要的是距离数值怎么办空间连接工具不会自动生成距离字段你需要再添加一个双精度字段距离右键计算几何属性选点到线距离或两点间距离即可计算出小区质心到商圈的距离。如果是面要素和点要素做CLOSEST匹配计算距离时建议用要素转点工具先把面转成质心点再计算点与点之间的距离这样距离值更可控。面要素之间的CLOSEST匹配会按最近边的距离计算结果会略有差异使用时要留意说明。4.3 mergeRule与字段映射的坑空间连接工具用起来方便但有两个地方特别容易出问题我在培训同事时长讲。第一个坑是字段映射里的mergeRule设置。在JOIN_ONE_TO_ONE模式下如果一个目标要素在空间上对应多个连接要素比如一个小区旁边有两所距离差不多的学校系统会默认取第一条记录。但如果你需要统计连接要素的某个数值字段比如求和、平均值、最大值必须在字段映射里把该字段的合并规则改成对应选项否则结果永远是单条记录的值统计毫无意义。我第一次做POI密度分析时就踩过这个坑出来的数量永远是1而不是真实的数量。第二个坑是字段名长度限制。空间连接输出的字段是连接要素字段名前缀的形式。如果连接要素字段名太长超过输出字段名的长度限制shapefile是10个字符地理数据库是64个字符系统会自动截断或重命名导致后期使用时字段名对不上。我的习惯是在做空间连接之前先把连接要素的字段名精简成简短明确的名称比如把商业建筑面积平方米改成面积再连接能省掉很多后期字段调整的麻烦。还有一点空间连接输出的是一个新的要素类不是对原图层的直接修改。如果你做的是一对多连接输出记录会是多行记录需要用汇总统计数据工具再聚合一次才能得到每个目标要素的最终统计值。这条流程看着绕但实际用途很大特别是做多维度指标计算时。5. 三招怎么选对比总结与组合套路三招我全部讲完了但我知道你肯定想问那我到底该用哪个现实情况是这三招不是互斥的它们在同一个项目中完全可以组合使用各有各的适用场景。5.1 三招横向对比表对比维度按位置选择相交空间连接操作入口菜单栏选择→按位置选择ArcToolbox→分析工具→叠加分析→相交ArcToolbox→分析工具→叠加分析→空间连接是否生成新几何生成新要素类导出时生成新要素类生成新要素类是否切割几何不切割输出原几何切割输出重叠部分不切割输出目标要素原几何适合场景判断哪些要素有关系提取重叠区域的精确边界按空间关系做属性统计、挂接属性保留方式只保留源图层的属性保留所有输入图层的属性目标要素属性连接要素属性典型输出选中的要素重叠区域的新面带统计字段的目标要素性能表现快百万级数据也基本能扛中数据量越大越慢中连接要素多时较慢这张表的核心是求关系用按位置选择求边界用相交求统计用空间连接。当然也有例外比如你要把所有重叠要素全部精确定位并统计面积那就得相交后再对结果做统计这就是组合使用的思路。5.2 我的推荐组合先相交、再按位置选择、最后空间连接以我实际做过的城市更新潜力评估项目为例需求是从存量用地中找出符合生态红线保护区基本农田批而未供地块三重叠条件的区域并为每个重叠地块挂接所在街道的行政区信息。第一步用相交工具一次性输入生态红线、基本农田、批而未供三个图层得到所有三重叠加区域。这一步产出的是严格的公共交集区域精确到几何边界。这里输入三个图层时输出的是三者的公共交集面如果需要两两叠加的区域需要分别做两次两两相交再合并。第二步用按位置选择判断这些重叠区域中哪些落在重点更新片区内。为什么不用相交直接叠加重点更新片区因为如果再用相交会对几何再切一次产生很多碎面。按位置选择的好处是能从已有重叠面中挑出符合条件的要素不会再引入新的几何分割。第三步用空间连接给筛选出来的重叠区域挂接所在街道名称和人口密度数据方便后期做数据分析。匹配选项选INTERSECT如果是多个街道覆盖同一区域需要按面积占比最大的街道来挂接这时可以先在字段映射中设置面积为权重或者用汇总统计数据做后处理。这个组合套路我用了很多年覆盖了从几何提取到属性统计的完整链条。实际项目中你不需要每一步都用到完全按需求来剪裁。6. 实操心得与避坑清单这三招我用了快十年踩过的坑数不胜数。最后这一章我不讲原理也不讲参数纯粹分享一些日常操作中总结出来的小细节希望对你有帮助。6.1 做GIS分析前先备份数据这句话我说一万次都不嫌多很多人做相交或者空间连接之前懒得备份原始数据结果工具参数设置错了把原始图层覆盖掉追悔莫及。ArcGIS里很多工具输出都要求指定一个新路径但万一你不小心把输出路径指到了原始数据上原数据立刻被覆盖而且无法恢复。我现在的习惯是凡是涉及提取、叠加的操作一律把原始数据复制一份到原始数据备份文件夹再开始操作。备份一分钟后悔少半天。6.2 注意输出数据格式对字段名的限制同样的操作输出到要素类地理数据库要素类和输出到shapefile对字段名的限制差异很大。shapefile的字段名最长10个字符中文支持一般复杂的中文长字段名经常被截断或显示成乱码。因此输出数据我优先输出到文件地理数据库File Geodatabase里字段名限制宽松性能也比shapefile好属性表操作更顺滑。尤其是空间连接之后的字段调整强烈建议使用地理数据库作为输出容器。6.3 多图层叠加前先降维能合并先合并能裁剪先裁剪做相交和空间连接之前凡是能提前用按属性选择、裁剪工具缩小数据范围的一定不要偷懒。原因很简单叠加分析的瓶颈在于几何运算量输入要素数量越小、几何越简单工具跑得越快。我有一个实际场景某个项目里的道路图层有上百万条线直接跟地块图层做空间连接计算了半个多小时还出不来结果。后来我先用按位置选择把全市道路裁剪到只保留穿过城区范围的几千条再做空间连接一分钟就出结果了。有时候快和慢之间就差一个先裁剪的步骤。6.4 最后的技术福利用ArcPy做批处理如果你手头的重复性提取工作特别多每次都手动点工具太浪费人生了。ArcGIS自带的Python环境可以直接调用分析工具。比如批量对多个地块做相交你可以在Python窗口里写import arcpy arcpy.env.workspace rC:\data\地块集合.gdb fc_list arcpy.ListFeatureClasses() for fc in fc_list: output_name fc.replace(原始, 重叠结果) arcpy.analysis.Intersect([fc, rC:\data\保护区.gdb\保护区], output_name, ALL)这样就能一次性把文件夹里所有地块图层与保护区做相交提取输出结果放在同一个地理数据库里。实际项目里我经常配合属性筛选、循环语句做批量处理一次跑完几十个文件省下的时间足够多喝两杯咖啡。7. 最后再分享一点我自己的体会这三招并不是什么高深的技术但恰恰是这些基础功能的灵活组合能解决工作中的大问题。说句实在话干GIS这行更多时候拼的不是用了多复杂的算法而是能不能把基础工具用出花来。按位置选择解决思路判断相交解决几何精确提取空间连接解决属性统计当它们在你手里可以随时灵活组合时大多数数据提取类的需求你都能在几分钟内拿出方案。还有一个我在实际项目中反复用到的细节处理完重叠区域提取后一定要做一遍结果质量抽查。方法很朴素就是随机挑几个结果要素叠加原始图层目视检查再随手查两条记录的属性是否合理。很多人做完提取直接拿去出图交成果结果被检查人员发现某个要素属性丢了或者边界偏移了回头找原因特别费劲。花五分钟抽查相当于给成果上了一个保险。如果你看完这篇文章能把手头那个不知道怎么提取重叠区域的需求直接落地成操作步骤那这篇内容就没白写。下次再遇到GIS数据处理的卡点也欢迎多交流毕竟这行互相借鉴经验永远是成长最快的方式。
返回列表