删除子几何图形的 Geopandas 方法
Geopandas way of removing child geometries
我有大量的形状多边形对象列表,其中有很多可能的几何形状,它们可能会落在彼此之间。
我正在尝试找到仅保留 parent/containing 个形状的最有效方法,并且需要摆脱任何子形状。
我试过的方法有:
方法一:做n-square的方法来查找是否有任何多边形被限制在任何其他多边形中,它是从列表中删除的候选者。但这是非常糟糕的表现,因为我有 600 万个形状。
方法 2:创建所有多边形中心的空间树(KDE 树或球树),然后为每个多边形的中心找到大约 5000 个最近的多边形,并检查它们是否落在中心的多边形,如果有则将其标记为子多边形。对所有多边形执行此操作,然后删除所有子多边形。这种方法有效,但对我来说似乎并不干净,而且假设没有多边形具有超过 5000 个子多边形(实际上就是这种情况),数字 5000 是硬编码的。但我对这个低于标准的代码不满意。
致所有 GeoPandas 人的问题:
问:必须有一种更好的方法来删除子多边形,方法是进行某种空间连接并轻松找到所有子多边形。请分享一些例子。
假设您的环境中有 pygeos 并且所有内容都是最新的,您可以使用带有 contains_properly
谓词的空间索引来完全过滤其他几何中的几何。查看玩具示例:
import numpy
import geopandas
import pandas
pts = geopandas.GeoSeries.from_xy(x=numpy.random.randint(0, 100, 50), y=numpy.random.randint(0, 100, 50))
# create polygons that are one within the other
geoms = pd.concat([pts.buffer(1), pts.buffer(2)])
parent_idx, children_idx = geoms.sindex.query_bulk(geoms, predicate="contains_properly")
结果为您提供所有 parents 和所有 children 的整数索引。不返回 parent/children 之外的几何图形。
我有大量的形状多边形对象列表,其中有很多可能的几何形状,它们可能会落在彼此之间。
我正在尝试找到仅保留 parent/containing 个形状的最有效方法,并且需要摆脱任何子形状。
我试过的方法有:
方法一:做n-square的方法来查找是否有任何多边形被限制在任何其他多边形中,它是从列表中删除的候选者。但这是非常糟糕的表现,因为我有 600 万个形状。
方法 2:创建所有多边形中心的空间树(KDE 树或球树),然后为每个多边形的中心找到大约 5000 个最近的多边形,并检查它们是否落在中心的多边形,如果有则将其标记为子多边形。对所有多边形执行此操作,然后删除所有子多边形。这种方法有效,但对我来说似乎并不干净,而且假设没有多边形具有超过 5000 个子多边形(实际上就是这种情况),数字 5000 是硬编码的。但我对这个低于标准的代码不满意。
致所有 GeoPandas 人的问题:
问:必须有一种更好的方法来删除子多边形,方法是进行某种空间连接并轻松找到所有子多边形。请分享一些例子。
假设您的环境中有 pygeos 并且所有内容都是最新的,您可以使用带有 contains_properly
谓词的空间索引来完全过滤其他几何中的几何。查看玩具示例:
import numpy
import geopandas
import pandas
pts = geopandas.GeoSeries.from_xy(x=numpy.random.randint(0, 100, 50), y=numpy.random.randint(0, 100, 50))
# create polygons that are one within the other
geoms = pd.concat([pts.buffer(1), pts.buffer(2)])
parent_idx, children_idx = geoms.sindex.query_bulk(geoms, predicate="contains_properly")
结果为您提供所有 parents 和所有 children 的整数索引。不返回 parent/children 之外的几何图形。