ArcGIS API for Javascript计算不同坐标系的长度、面积、距离和缓冲区

本文详细介绍了ArcGISAPIforJavaScript中如何使用不同的方法进行长度、面积计算,以及处理WGS84、Web墨卡托和其他投影坐标系的技巧。包括geodesicLength(),geodesicArea(),planarLength(),geodesicDistance()和geometryBuffer()函数的用法及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、计算长度

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 墨卡托以外的投影坐标系缓冲几何时才使用缓冲区(此方法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值