如何从地理库中调用GEOSDistance_r

时间:2018-03-06 00:19:18

标签: ctypes shapely geos

我正在尝试通过直接调用GEOS库来加快多边形和点/多边形之间的空间距离计算。但是,我无法找到任何帮助如何正确调用此功能。任何人都可以请指出我可以找到此功能的参考位置或指出我做错了什么位置?

工作示例:

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)

1 个答案:

答案 0 :(得分:1)

GEOSDistance_r需要4个参数,你只传递3个:

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调用来通过引用传递double:

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