如何在Databricks Mosaic中创建含多个outer多边形的几何对象
处理Databricks Mosaic解析OSM PBF时多Outer多边形的转换问题
- OSM里带多个Outer环的要素对应GIS中的MultiPolygon类型,
st_makepolygon只能处理单个带内环的多边形,直接用它处理多Outer场景肯定行不通 - 正确操作流程:
- 先把每个Outer环单独转成Polygon:如果该Outer环有对应的内环,就把内环数组传给
st_makepolygon;没有内环的话只传Outer环即可 - 把所有生成的Polygon聚合到数组里,要么直接转成MultiPolygon,要么用
st_union合并
- 先把每个Outer环单独转成Polygon:如果该Outer环有对应的内环,就把内环数组传给
- 实际代码参考:
from pyspark.sql import functions as F from mosaic import functions as mf # 假设数据中,outer_rings是所有Outer环的数组,inner_rings是按Outer环分组的内环数组 df = df.withColumn("single_polygons", F.expr( "transform(outer_rings, (ring, idx) -> st_makepolygon(ring, inner_rings[idx]))" )) # 方式1:转成MultiPolygon df = df.withColumn("multi_polygon", mf.st_geomfromwkt(mf.st_astext(mf.st_collect("single_polygons")))) # 方式2:用st_union合并成单个Polygon(适用于几何相邻的场景) df = df.withColumn("unioned_polygon", mf.st_union(F.expr("aggregate(single_polygons, st_geometry('EMPTY'), (acc, p) -> st_union(acc, p))"))) - 踩坑提示:
- 必须保证内环和对应的Outer环正确关联,别把所有内环都丢给每个Outer环
- 如果
st_union没效果,检查下几何数组是否为空,或者环的方向是否符合要求——OSM规定Outer环为逆时针、Inner环为顺时针,要是方向反了,Mosaic可能识别异常,可尝试用st_reverse调整环的顺序
内容的提问来源于stack exchange,提问作者Swapnil Dukare
相关产品推荐
相关产品推荐

