支持Great Circle Distance和多边形的快速python GIS库

asa*_*afm 9 python gis performance polygon great-circle

我在寻找python的地理库.我需要能够做到以下几点:

  1. 使用大圆距离(不是线性距离计算)获取2点(以米为单位)之间的距离
  2. 检查点是否在多边形内
  3. 每秒执行1到2次,每次数千次

一开始我看了这篇文章: Python模块用于存储和查询地理坐标并开始使用geopy.我遇到了两个问题:

  1. Geopy不支持多边形
  2. geoPy的高CPU使用率(计算一个点与相对5000点之间的距离需要大约140ms的CPU)

我一直在寻找并发现最佳Python GIS库?https://gis.stackexchange.com/.它看起来很有希望因为地理位置使用的是编译的C代码,它应该更快,并且可以更好地支持多边形.问题是geos/OGR执行线性距离计算而不是球体.这消除了所有其他基于地理的模块(如GEODjango和形状).我在这里错过了什么吗?我不认为我是第一个使用python进行GIS计算并希望获得准确结果的人.

hoo*_*nto 1

更新

现在继续完成该库中的其他 576 个函数,不包括已完成的两个多边形函数、已完成的三个球体距离算法以及两个新函数:angle_box_2d 和 angle_contains_ray_2d。另外,我切换到 C 版本,这样就不需要 extern,简化了工作。将旧的 C++ 版本放在 old_c++ 目录中,因此它仍然存在。

经过测试的性能,它与答案底部列出的相同。


更新2

所以只是一个快速更新,我还没有完成整个库(我只完成了大约 15%),但我已经在 github 上添加了这些未经测试的函数,以防万一您立即需要它们添加到多边形和球体距离算法中的旧点。

angle_box_2d
angle_contains_ray_2d
angle_deg_2d
angle_half_2d # MLM: double *
angle_rad_2d
angle_rad_3d
angle_rad_nd
angle_turn_2d
anglei_deg_2d
anglei_rad_2d
annulus_area_2d
annulus_sector_area_2d
annulus_sector_centroid_2d # MLM: double *
ball_unit_sample_2d # MLM: double *
ball_unit_sample_3d # MLM: double *
ball_unit_sample_nd # MLM; double *
basis_map_3d #double *
box_01_contains_point_2d
box_01_contains_point_nd
box_contains_point_2d
box_contains_point_nd
box_ray_int_2d
box_segment_clip_2d
circle_arc_point_near_2d
circle_area_2d
circle_dia2imp_2d
circle_exp_contains_point_2d
circle_exp2imp_2d
circle_imp_contains_point_2d
circle_imp_line_par_int_2d
circle_imp_point_dist_2d
circle_imp_point_dist_signed_2d
circle_imp_point_near_2d
circle_imp_points_2d # MlM: double *
circle_imp_points_3d # MLM: double *
circle_imp_points_arc_2d
circle_imp_print_2d
circle_imp_print_3d
circle_imp2exp_2d
circle_llr2imp_2d # MLM: double *
circle_lune_area_2d
circle_lune_centroid_2d # MLM; double *
circle_pppr2imp_3d
Run Code Online (Sandbox Code Playgroud)

我上面评论的那些可能行不通,其他的可能行不通,但同样 - 多边形和球体距离肯定行。您可以指定米、公里、英里、海里,这对于球面距离并不重要,输出的单位与输入的单位相同 - 算法与单位无关。


我今天早上把它放在一起,所以它目前只提供多边形中的点、凸多边形中的点和三种不同类型的球面距离算法,但至少您要求的那些现在可供您使用。我不知道是否与任何其他 python 库存在名称冲突,这些天我只是外围地参与了 python,所以如果有更好的名称,我愿意接受建议。

在 github 上:https: //github.com/hoonto/pygeometry

它只是一个连接此处描述和实现的函数的 Python 桥梁:

http://people.sc.fsu.edu/~jburkardt/cpp_src/geometry/geometry.html

GEOMETRY 库实际上非常好,所以我认为为 python 桥接所有这些函数会很有用,我今晚可能会这样做。

编辑:其他一些事情

  1. 因为数学函数实际上是 C++ 编译的,所以您当然需要确保共享库位于路径中。您可以修改geometry.py以指向您想要放置该共享库的任何位置。
  2. 仅针对 Linux 编译,.o 和 .so 是在 x86_64 fedora 上编译的。
  3. 球面距离算法需要弧度,因此您需要将十进制纬度/经度转换为弧度,如 Geometry.py 中所示。

如果您在 Windows 上确实需要此功能,请告诉我,在 Visual Studio 中只需几分钟即可完成。但除非有人问,否则我可能会暂时不管它。

希望这可以帮助!

Rgds....Hoonto/马特

(新提交:SHA:4fa2dbbe849c09252c7bd931edfe8db478de28e6 - 修复了一些问题,例如弧度转换以及 py 函数的返回类型。还添加了一些基本性能测试以确保库正常运行。)

测试结果 在每次迭代中,一次调用 sphere_distance1,一次调用 Polygon_contains_point_2d,因此总共调用 2 次库。

  • ~0.062s:2000 次迭代,4000 次调用
  • ~0.603s:20000 次迭代,40000 次调用
  • ~0.905s:30000 次迭代,60000 次调用
  • ~1.198s:40000 次迭代,80000 次调用