目录
1、WGS84或web墨卡托,使用geometryEngine.geodesicLength()方法
2、WGS84以外的地理坐标系,使用geodesicUtils.geodesicLengths()方法
3、web墨卡托以外的投影坐标系,使用geometryEngine.planarLength()方法
1、WGS84或web墨卡托,使用geometryEngine.geodesicArea()方法
2、WGS84以外的地理坐标系,使用geodesicUtils.geodesicAreas()方法
3、web墨卡托以外的投影坐标系,使用geometryEngine.planarArea()方法
1、地理坐标系,使用geodesicUtils.geodesicDistance()方法
2、投影坐标系,使用geometryEngine.distance()方法
1、WGS84或web墨卡托,使用geometryEngine.geodesicBuffer()方法
2、WGS84以外的地理坐标系,使用geometryService.buffer()方法
3、web墨卡托以外的投影坐标系,使用geometryEngine.buffer()方法
ArcGIS API for Javascript有多种计算长度、面积等的方法,我们经常会弄混,今天详细梳理一下每种方法的适用场景
一、计算长度
import * as geometryEngine from '@arcgis/core/geometry/geometryEngine'
import * as geodesicUtils from '@arcgis/core/geometry/support/geodesicUtils'
/** 计算长度
* @param {Geometry} geometry 几何
* @param {String} unit 单位
*/
export function geometryLength(geometry, unit) {
// 坐标系类型:
//(1:WGS84或web墨卡托,2:WGS84以外的地理坐标系,3:web墨卡托以外的投影坐标系)
const wkidType =
view.spatialReference.isWGS84 || view.spatialReference.isWebMercator
? 1
: view.spatialReference.isGeographic
? 2
: 3
switch (wkidType) {
case 1:
return geometryEngine.geodesicLength(geometry, unit)
case 2:
return geodesicUtils.geodesicLengths([geometry], unit)[0]
case 3:
return geometryEngine.planarLength(geometry, unit)
default:
return null
}
}
1、WGS84或web墨卡托,使用geometryEngine.geodesicLength()方法
geometryEngine.geodesicLength() 计算输入几何图形的长度。测地线长度()在执行此计算时会考虑地球的曲率。因此,当使用空间参考为 WGS84(wkid:4326) 或 Web 墨卡托,最佳实践是使用 geodesicLength() 计算长度。
2、WGS84以外的地理坐标系,使用geodesicUtils.geodesicLengths()方法
geodesicUtils.geodesicLengths() 通过大地测量计算一个或多个几何的面周长或线长度。
3、web墨卡托以外的投影坐标系,使用geometryEngine.planarLength()方法
geometryEngine.planarLength() 计算输入几何图形的长度。与 geodesicLength() 不同,planeLength() 使用投影坐标,并且在执行此计算时不考虑地球的曲率。如果输入几何具有 Web Mercator 以外的投影坐标系,请改用 planeLength()。
注意事项:
1、测量绘制的图形长度时,如果view的坐标系为web墨卡托,输入的几何图形设置坐标系为web墨卡托,如果view的坐标系为其他坐标系,输入的几何图形不设置坐标系,否则单位传参为meters(米)进行计算时,会报错误坐标系不一致
二、计算面积
import * as geometryEngine from '@arcgis/core/geometry/geometryEngine'
import * as geodesicUtils from '@arcgis/core/geometry/support/geodesicUtils'
/** 计算面积
* @param {Geometry} geometry 几何
* @param {String} unit 单位
*/
export function geometryArea(geometry, unit) {
// 坐标系类型:
//(1:WGS84或web墨卡托,2:WGS84以外的地理坐标系,3:web墨卡托以外的投影坐标系)
const wkidType =
view.spatialReference.isWGS84 || view.spatialReference.isWebMercator
? 1
: view.spatialReference.isGeographic
? 2
: 3
switch (wkidType) {
case 1:
return geometryEngine.geodesicArea(geometry, unit)
case 2:
return geodesicUtils.geodesicAreas([geometry], unit)[0]
case 3:
return geometryEngine.planarArea(geometry, unit)
default:
return null
}
}
1、WGS84或web墨卡托,使用geometryEngine.geodesicArea()方法
geometryEngine.geodesicArea() 计算输入几何图形的面积。 在执行此计算时会考虑地球的曲率。因此,当使用空间参考为 WGS84(wkid:4326) 或 Web 墨卡托,最佳实践是使用 geodesicArea() 计算面积。
2、WGS84以外的地理坐标系,使用geodesicUtils.geodesicAreas()方法
geodesicUtils.geodesicAreas() 通过大地测量计算一个或多个面的面积。
3、web墨卡托以外的投影坐标系,使用geometryEngine.planarArea()方法
geometryEngine.planarArea() 计算输入几何图形的面积。与 geodesicArea() 不同,planeArea() 使用投影坐标执行此计算,并且不考虑地球的曲率。如果输入几何具有 Web Mercator 以外的投影坐标系,请改用 planeArea()。
注意事项:
1、测量绘制的图形面积时,如果view的坐标系为web墨卡托,输入的几何图形设置坐标系为web墨卡托,如果view的坐标系为其他坐标系,输入的几何图形不设置坐标系,否则单位传参为square-meters(平方米)进行计算时,会报错误坐标系不一致
2、area会存在计算出负值的情况,这时使用geometryEngine.simplify先对输入几何图形简化使其定义相对于其几何类型在拓扑上合法,在简化操作结束时,多边形环或折线路径不会重叠也不会发生自相交,然后再进行面积计算
let area = gisAnalysis.geometryArea(view, geo, 'square-meters')
if (area !== 0 && area !== -0) {
if (area < 0) {
const simplifiedPolygon = geometryEngine.simplify(geo)
if (simplifiedPolygon) area = gisAnalysis.geometryArea(view,simplifiedPolygon,'square-meters')
}
}
三、计算两点间的距离
import * as geometryEngine from '@arcgis/core/geometry/geometryEngine'
import * as geodesicUtils from '@arcgis/core/geometry/support/geodesicUtils'
/** 计算两点间的距离
* @param {Point} point1 几何点1
* @param {Point} point2 几何点2
* @param {String} unit 单位
*/
export function geometryDistance(point1, point2, unit) {
// 坐标系类型(1:地理坐标系,2:投影坐标系)
const wkidType = point1.spatialReference.isGeographic ? 1 : 2
switch (wkidType) {
case 1:
return geodesicUtils.geodesicDistance(point1, point2, unit).distance
case 2:
return geometryEngine.distance(point1, point2, unit)
default:
return null
}
}
1、地理坐标系,使用geodesicUtils.geodesicDistance()方法
geodesicUtils.geodesicDistance() 大地测量计算两个已知位置之间的方向和距离。两个输入点必须具有相同的地理坐标系。
2、投影坐标系,使用geometryEngine.distance()方法
geometryEngine.distance() 计算两个几何图形之间的最短平面距离。距离以 distanceUnit
指定的线性单位报告,如果 distanceUnit
为空,则以输入几何的 spatialReference 单位报告。
四、获取缓冲区
import * as geometryEngine from '@arcgis/core/geometry/geometryEngine'
import BufferParameters from '@arcgis/core/rest/support/BufferParameters'
import * as geometryService from '@arcgis/core/rest/geometryService'
import * as projection from '@arcgis/core/geometry/projection'
/** 获取缓冲区
* @param {Geometry} geometry 几何
* @param {Number} distance 缓冲距离
* @param {String} unit 单位
* @param {Number} projectWkid 投影坐标系的wkid值(当几何的坐标系为WGS84以外的地理坐标系时使用)
*/
export function geometryBuffer(geometry, distance, unit, projectWkid) {
// 坐标系类型:
//(1:WGS84或web墨卡托,2:WGS84以外的地理坐标系,3:web墨卡托以外的投影坐标系)
const wkidType =
view.spatialReference.isWGS84 || view.spatialReference.isWebMercator
? 1
: view.spatialReference.isGeographic
? 2
: 3
return new Promise((resolve) => {
switch (wkidType) {
case 1:
resolve(geometryEngine.geodesicBuffer(geometry, distance, unit))
break
case 2:
let bufferSr = new SpatialReference({ wkid: projectWkid })
let projectGeo = projection.project(geometry, bufferSr)
var params = new BufferParameters({
distances: [distance],
unit: unit,
bufferSpatialReference: bufferSr,
outSpatialReference: view.spatialReference,
geometries: [projectGeo]
})
geometryService
.buffer('https://sampleserver6.arcgisonline.com/arcgis/rest/services/Utilities/Geometry/GeometryServer/buffer',
params
)
.then(function (results) {
resolve(results[0])
})
break
case 3:
resolve(geometryEngine.buffer(geometry, distance, unit))
break
default:
break
}
})
}
1、WGS84或web墨卡托,使用geometryEngine.geodesicBuffer()方法
geometryEngine.geodesicBuffer() 在输入几何图形周围的指定距离处创建流地缓冲区面。在计算距离时,此方法会考虑地球的曲率,从而在处理非常大的几何图形和/或在全球范围内空间变化的几何图形时提供高度准确的结果,其中一个投影坐标系无法准确绘制坐标和测量距离 对于所有几何形状。
此方法仅适用于 WGS84 (wkid: 4326) 和 Web 墨卡托 空间参考。
2、WGS84以外的地理坐标系,使用geometryService.buffer()方法
geometryService.buffer() 在给定几何图形周围的指定距离处创建缓冲区多边形。需要借助于serverGeometryService 的 Server REST 服务 URL。
3、web墨卡托以外的投影坐标系,使用geometryEngine.buffer()方法
geometryEngine.buffer() 仅在尝试使用除 Web 墨卡托以外的投影坐标系缓冲几何时才使用缓冲区(此方法)。