geo_polygon_densify()

通过添加中间点将多边形或多多边形的平面边缘转换为测地线。

语法

geo_polygon_densify(polygon,tolerance, [ preserve_crossing ])

详细了解语法约定

参数

客户 类型​​ 必需 说明
polygon dynamic 采用 GeoJSON 格式的多边形或多多边形。
tolerance int、long 或 real 用于定义原始平面边缘与转换后的测地线边缘链之间的最大距离(以米为单位)。 支持的值范围为 [0.1, 10000]。 如果未指定,则默认值为 10
preserve_crossing bool 如果为 true,则在反子午线上保持边缘交叉。 如果未指定,则使用默认值 false

多边形定义

dynamic({"type": "Polygon","coordinates": [ LinearRingShell, LinearRingHole_1, ..., LinearRingHole_N ]})

dynamic({"type": "MultiPolygon","coordinates": [[ LinearRingShell, LinearRingHole_1, ..., LinearRingHole_N ], ..., [LinearRingShell, LinearRingHole_1, ..., LinearRingHole_M]]})

  • LinearRingShell 是必需的,定义为 counterclockwise 有序坐标数组 [[lng_1,lat_1],...,[lng_i,lat_i],...,[lng_j,lat_j],...,[lng_1,lat_1]]。 只能有一个 shell。
  • LinearRingHole 是可选的,定义为 clockwise 有序坐标数组 [[lng_1,lat_1],...,[lng_i,lat_i],...,[lng_j,lat_j],...,[lng_1,lat_1]]。 可以有任意数量的内部环和孔。
  • LinearRing 顶点必须很独特,至少有三个坐标。 第一个坐标必须等于最后一个坐标。 至少需要四个条目。
  • 坐标 [经度, 纬度] 必须有效。 经度必须是 [-180, +180] 范围内的实数,纬度必须是 [-90, +90] 范围内的实数。
  • LinearRingShell 最多包含球体的一半。 LinearRing 将球体分成两个区域。 将选择这两个区域中较小的一个。
  • LinearRing 边缘长度必须小于 180 度。 将选择两个顶点之间的最短边缘。

约束

  • 致密多边形的最大点数限制为 10485760。
  • dynamic 格式存储多边形有大小限制。
  • 将有效多边形致密化可能会使该多边形无效。 此算法以非均匀的方式添加点,因此可能导致边缘彼此缠绕。

动机

  • GeoJSON 格式将两点之间的边定义为直笛卡尔线,而 geo_polygon_densify() 使用测地线
  • 是使用测地线还是平面边缘可能取决于数据集,在长边中尤其如此。

返回

采用 GeoJSON 格式dynamic 数据类型的致密多边形。 如果多边形或公差无效,则查询会生成 null 结果。

注意

WGS-84 坐标参考系统表示方法对地理空间坐标进行解释。

示例

以下示例致密化曼哈顿中央公园多边形。 这些边缘较短,平面边缘与其对应的测地线之间的距离小于公差规定的距离。 因此,结果保持不变。

print densified_polygon = tostring(geo_polygon_densify(dynamic({"type":"Polygon","coordinates":[[[-73.958244,40.800719],[-73.949146,40.79695],[-73.973093,40.764226],[-73.982062,40.768159],[-73.958244,40.800719]]]})))

输出

densified_polygon
{"type":"Polygon","coordinates":[[[-73.958244,40.800719],[-73.949146,40.79695],[-73.973093,40.764226],[-73.982062,40.768159],[-73.958244,40.800719]]]}

以下示例致密化多边形的两条边。 致密化后的边长度约为 110 公里

print densified_polygon = tostring(geo_polygon_densify(dynamic({"type":"Polygon","coordinates":[[[10,10],[11,10],[11,11],[10,11],[10,10]]]})))

输出

densified_polygon
{"type":"Polygon","coordinates":[[[10,10],[10.25,10],[10.5,10],[10.75,10],[11,10],[11,11],[10.75,11],[10.5,11],[10.25,11],[10,11],[10,10]]]}

下面的示例由于坐标输入无效而返回 null 结果。

print densified_polygon = geo_polygon_densify(dynamic({"type":"Polygon","coordinates":[[[10,900],[11,10],[11,11],[10,11],[10,10]]]}))

输出

densified_polygon

下面的示例由于公差输入无效而返回 null 结果。

print densified_polygon = geo_polygon_densify(dynamic({"type":"Polygon","coordinates":[[[10,10],[11,10],[11,11],[10,11],[10,10]]]}), 0)

输出

densified_polygon