在最近的项目中,客户要求根据所选地图的斑块求取该斑块所跨省份的面积对比,经过具体分析要用到GIS中拓扑的相交来求出相交部分确定面积
首先我们来看下Arcgis For Js Api中是怎么求两个几何要素的交集的
方式一:`客户端的geometryEngine`
引用的模块:"esri/geometry/geometryEngine"
具体使用该模块的intersect方法.
我们来具体看一下
方法名:`intersect`
参数:
- geometry (数据类型为单个geometry或者geometry数组,此参数为进行交集的几何元素)
- intersector (数据类型为单个geometry,此元素为目标元素)
返回值
Geometry | Geometry[] (返回相交的几何要素/几何要素的数组)
由api我们得知只需要一个geometry和一个geometry或者geometry数组就可以求交集了,那我们可以用斑块的geometry和
全省份图的geometry来求交集了
具体如下:
//得到相交的值
var interPloy = geometryEngine.intersect(geomboj.geom1, geomboj.geom2)
for (let i = 0; i < interPloy.length; i++) {
//因为它会根据参数二的与所有的子集都做交集计算,有的返回数据,没有的返回null
//所以需要做判断
if (!(interPloy[i] === null)) {
//此时的i便是相交项的index
//这里拿到的只是geometry,想要拿到属性或者设置样式,还需要把它变成graphic
//把它变成graphic
let graphic =new Graphic(interPloy[i])
//新建一个GraphicsLayer用来存放graphic
let GraphicsLayer = new GraphicsLayer()
//将graphic放在raphicsLayer
GraphicsLayer.add(graphic)
//将graphic放在map上
map.addLayer(GraphicsLayer)
//接下来,为所欲为吧,添加样式,绑定属性,都可以的
}
方式二:`服务器的GeometryService几何服务`
具体利用GeometryService中intersect函数实现
引用的模块为:"esri/tasks/GeometryService"
我们来具体看一下
方法名:`intersect`
参数:
- geometries (数据类型为Geometry[],此参数为进行交集的几何元素)
- geometry (数据类型为Geometry,此元素为目标元素)
- callback(成功的回调函数)
- error(失败的回调函数)
具体的使用方法和第一个客户端的intersect是差不多的,我们来看下
//新建一个几何服务类,传入几何服务的地址
let geometryService = new GeometryService("https://utility.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
geometryService.intersect(geomboj.geom1, geomboj.geom2,(res)=>{
//res为相交的元素
})