Arcgis api for JavaScript叠加分析geometryEngine.contains

本文介绍了如何利用ArcGIS API for JavaScript中的geometryEngine.contains方法进行地图叠加分析,详细阐述了该方法在地理空间数据操作中的应用,帮助开发者理解并实现地图元素的包含检查。

叠加分析geometryEngine.contains:

//创建FeatureLayer要素图层
			var targetLayer = mapManager.createFeatureLayer($("#targetLayer").combobox("getValue"));
			var targetFeatures = null;
			//存储饼状图展示数据
			var overlayArray = [];
			//存储各个类型名称和数量
			var dataName = [];
			//存储各个类型下的数据
	    	var arrayAll = new Array();
			//查询要素图层得到所有要素集
			targetLayer.queryFeatures().then(function(results){
				targetFeatures = results.features;
				global.currentQueryUrl = $("#joinLayer").combobox("getValue");
				//创建FeatureLayer要素图层
            	var joinLayer = mapManager.createFeatureLayer(global.currentQueryUrl);
            	//查询要素图层得到所有要素集
            	joinLayer.queryFeatures().then(function(results){
            		featureArray = results.features;
            		for(var i=0; i<targetFeatures.length; i++){
            			var count = 0;
            			var array = new Array();
            			for(var j=0; j<featureArray.length; j++){
            				//循环判断2个图形是否重叠,如果重叠则记录在数值里
            				if(geometryEngine.contains(targetFeatures[i].geometry,featureArray[j].geometry)){
            					count++;
            					featureArray[j].attributes.id = featureArray[j].attributes.ID;
            					array.push(featureArray[j].attributes);
            				}
            			}
            			arrayAll.push(array);
            			overlayArray.push({"name":targetFeatures[i].attributes.NAME+":"+count,"value":count});
            			dataName.push({"name":targetFeatures[i].attributes.NAME,"count":count});
            		}
            		$("#contentBox").html("<hr><div id=\"overlayPie\" style=\"width:360px;height:300px;\" align=\"center\"></div><div id=\"overlayResultDg\" data-options=\"width:360,striped:true\"></div>");
            		overlayAnalysis.pieResult(overlayArray);
            		overlayAnalysis.overlayDg(dataName,arrayAll);
            	});
			});

<think>我们参考用户的问题:"我想查找在ArcGIS中只获取与点相交的面要素的方法" 根据引用[2]中提到的:通过ARCGIS JS API,两个要素相交的判断 geometryEngine.intersects(geometry1, geometry2),如果相交,返回true,不相交则返回false。但用户是在桌面端操作,我们可能需要使用桌面ArcGIS(如ArcMap或ArcGIS Pro)的工具。 另外,引用[1]中提到了使用空间连接(Spatial Join)的方法,引用[4]中提到了处理面要素的相邻关系,但我们需要的是点与面相交。 在ArcGIS桌面中,获取与点相交的面要素,常用的方法有: 1. 使用“选择-按位置选择”工具:选择面要素,其要素与点要素图层中的要素相交(INTERSECT)。 2. 使用“空间连接”工具:将点要素的空间位置信息连接到面要素上,然后根据连接结果筛选出面要素。 3. 使用“相交”工具:但注意,相交工具要求输入必须为同类型几何,所以不能直接用点和面做相交。但是我们可以通过其他方式。 具体步骤(以按位置选择为例): 方法一:按位置选择 - 打开面要素图层和点要素图层。 - 在菜单栏选择“选择”->“按位置选择”。 - 设置参数: * 选择目标图层中的要素(这里选择面要素图层) * 源图层:点要素图层 * 空间选择方法:目标图层要素与源图层要素相交(INTERSECT) - 点击确定,这样就会选中所有与点相交的面。 - 然后可以将选中的面导出为新图层。 方法二:空间连接 - 打开“空间连接”工具(在工具箱中:分析工具->叠加分析->空间连接)。 - 目标要素:面要素 - 连接要素:点要素 - 连接操作:JOIN_ONE_TO_ONE(一对一连接)并勾选“保留所有目标要素”为不勾选(即只保留有匹配的点要素的面),或者使用JOIN_ONE_TO_MANY(一对多)然后根据匹配情况筛选。 但是注意:我们只想保留那些与点相交的面,所以可以设置“匹配选项”为INTERSECT(相交)。但是空间连接默认是匹配所有目标要素,如果我们不勾选“保留所有目标要素”,则只会保留那些至少有一个点与之相交的面。 - 在输出中,每个面要素会有一个连接点要素的字段(比如COUNT_),我们可以根据这个字段来判断是否有相交点(COUNT_>=1),然后筛选即可。 但是方法二可能会产生重复的面(如果一个面有多个点,则会出现多个记录),所以如果我们只需要每个面一次,可以在空间连接后根据面的唯一字段进行汇总(比如去重),或者使用方法一更直接。 方法三:使用“相交”工具生成点与面的交集(输出结果将是点,但是每个点会带有它所相交的面的属性),然后根据面的属性去提取面。步骤: - 使用“相交”工具(分析工具->叠加分析->相交),输入要素为点要素和面要素(注意:可以输入多个要素类,但输出几何类型为输入要素的最低维度,这里点维度最低,所以输出的是点)。 - 相交后得到的点要素会包含原始点属性和相交面的属性。 - 然后根据这个点要素中的面的唯一标识(如FID)去选择面要素。 但是方法三需要确保面有唯一标识,且步骤稍多。 推荐方法一,因为它最简单直接。 另外,如果使用ArcPy,可以这样写: ```python import arcpy # 设置环境 arcpy.env.workspace = "your_workspace" # 输入点图层 point_layer = "points.shp" # 输入面图层 polygon_layer = "polygons.shp" # 使用按位置选择 arcpy.SelectLayerByLocation_management(polygon_layer, "INTERSECT", point_layer) # 将选中的面导出 arcpy.CopyFeatures_management(polygon_layer, "selected_polygons.shp") ``` 总结:在ArcGIS桌面中,获取与点相交的面要素,最简单的方法是使用“按位置选择”工具,然后导出选中的面。 根据引用[2]中提到的geometryEngine.intersects,如果是开发环境(如ArcGIS API for JavaScript)可以使用该接口,但用户问题是在ArcGIS桌面软件中操作,所以不适用。 因此,我们给出桌面环境下的解决方案。 相关问题: 1. 如何获取与点要素完全在面内部的要素? 2. 如何统计每个面内有多少个点? 3. 如何将点与面的属性进行关联并赋值? 注意:用户的问题只要求相交,相交包括点在面上(边界)和在面内部。如果只想获取点在面内部的(不包括边界),则需要使用“包含”关系(COMPLETELY_CONTAINS,但注意点是零维,面包含点通常是指点在面内部,不包括边界)。但是按位置选择工具中,相交(INTERSECT)已经包含了点在内部和边界的情况。如果需要严格在内部,可以选择“包含”关系(CONTAINS),因为点被面包含,那么点一定在面内部(包括边界?注意CONTAINS包含边界)。实际上,在ArcGIS中,CONTAINS关系是包含边界的,所以如果点恰好落在边界上,也会被视为包含。如果不想包括边界,可能需要使用WITHIN,然后在关系中选择“目标要素包含源要素”(即点完全在面内部,不包括边界)?但按位置选择中没有直接提供“严格内部”的选项,可以使用“目标要素包含源要素”并设置搜索距离为0,这样点落在边界上就不会被选中?实际上,点落在边界上时,面包含点,点也被面包含(相交),所以无法避免。如果需要精确排除边界,可能需要使用边界处理工具,这比较复杂。 因此,用户如果只是需要相交(包括边界和内部),使用INTERSECT即可。 </think>在ArcGIS中获取仅与点要素相交的面要素,可通过以下两种高效方法实现: ### 方法一:使用"选择-按位置选择"工具(推荐) 1. **加载数据**:添加点要素图层和面要素图层至地图 2. **打开工具**: - 菜单栏选择 > 按位置选择 3. **参数设置**: ```plaintext 选择目标图层中的要素:面要素图层 源图层:点要素图层 空间选择方法:目标图层要素与源图层要素相交(INTERSECT) ``` 4. **执行选择**:点击确定后自动选中所有与点相交的面 5. **导出结果**: - 右键面图层 > 数据 > 导出数据 - 仅导出所选要素,保存为新图层 > 此方法直接筛选相交要素,无需创建中间数据,效率最高[^1][^2] ### 方法二:使用"空间连接"工具(需保留属性) 1. **执行空间连接**: ```plaintext 目标要素:面图层 连接要素:点图层 匹配选项:相交(INTERSECT) 连接操作:JOIN_ONE_TO_ONE(一对一连接) ``` 2. **过滤结果**: - 连接后生成的新图层中 - 使用"按属性选择":`WHERE "Join_Count" >= 1` 3. **导出最终面要素**: - 将筛选后的要素导出为新图层 ### 关键注意事项 1. **几何精度**:建议启用地理处理选项中的"几何容差"(0.001米)避免边界点误判[^3] 2. **大型数据处理**: - 先使用"创建要素图层"建立临时图层加速处理 - 或通过`arcpy.SelectLayerByLocation_management()`编写批处理脚本 3. **空间索引优化**: - 右键数据集 > 属性 > 索引选项卡 - 重建空间索引提升查询速度 > 两种方法均基于空间关系计算,其中方法一执行速度最快,方法二适合需要关联点属性的场景[^1][^2] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值