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 |
---|