如何从 geos 库中调用 GEOSDistance_r

how to call GEOSDistance_r from geos library

我试图通过直接调用 GEOS 库来加快多边形和 points/polygons 之间的空间距离计算。但是我找不到任何帮助如何正确调用此函数。任何人都可以指出我可以找到此功能参考的位置或指出我做错的地方吗?

工作示例:

from shapely.geos import lgeos

points_geom = np.array([x._geom for x in points])
polygons_geom = np.array([x._geom for x in polygons])  
lgeos._lgeos.GEOSContains_r(lgeos.geos_handle,polygons_geom[0],points_geom[0])

不工作:

lgeos._lgeos.GEOSDistance_r(lgeos.geos_handle,polygons_geom[0],points_geom[0])


TypeError                                 Traceback (most recent call last)
<ipython-input-138-392cb700cfbc> in <module>()
----> 1 lgeos._lgeos.GEOSDistance_r(lgeos.geos_handle,polygons_geom[0],points_geom[0])

TypeError: this function takes at least 4 arguments (3 given)

GEOSDistance_r 有 4 个参数,你只传递了三个:

extern int GEOS_DLL GEOSDistance_r(GEOSContextHandle_t handle,
                                   const GEOSGeometry* g1,
                                   const GEOSGeometry* g2, double *dist);

(来自 https://github.com/OSGeo/geos/blob/5a730fc50dab2610a9e6c037b521accc66b7777b/capi/geos_c.h.in#L1100

您正在使用 shapely 的 GEOS 私有接口,它看起来使用了 ctypes,因此您需要使用 ctypes 调用来通过引用传递双精度值:

import ctypes
dist = ctypes.c_double()
lgeos._lgeos.GEOSContains_r(
    lgeos.geos_handle, polygons_geom[0], points_geom[0], ctypes.byref(dist))
dist = dist.value