python - 支持大圆距离和多边形的快速 python GIS 库

标签 python performance gis polygon great-circle

我正在寻找 python 的地理图书馆。 我需要能够执行以下操作:

  1. 使用 Great-circle distance 获取两点之间的距离(以米为单位) (不是线性距离计算)
  2. 检查点是否在多边形内
  3. 每秒执行 1 和 2 几千次

一开始我看过这篇文章:Python module for storing and querying geographical coordinates并开始使用geopy . 我遇到了 2 个问题:

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

我继续寻找并找到了 Best Python GIS library?https://gis.stackexchange.com/ .它看起来很有前途,因为 geos 使用的是编译的 C 代码,它应该更快并且支持多边形。 问题是 geos/OGR 执行线性距离计算而不是球体。这消除了所有其他基于 geos 的模块(如 GEODjango 和 shapely)。 我在这里错过了什么吗?我不认为我是第一个使用 python 执行 GIS 计算并希望获得准确结果的人。

最佳答案

更新

现在继续完成该库中的其他 576 个函数,不包括已完成的两个多边形函数、已完成的三个球体距离算法和两个新函数,angle_box_2d 和 angle_contains_ray_2d。另外,我切换到 C 版本,这样就不需要 externs,简化了工作。将旧的 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

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


我今天早上把它放在一起,所以它目前只提供了多边形中的点、凸多边形中的点和三种不同类型的球面距离算法,但至少你要求的那些现在可以使用了。我不知道是否与其他任何 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/Matt

(新提交: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 次调用

关于python - 支持大圆距离和多边形的快速 python GIS 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17022006/

相关文章:

Python:覆盖基类

python - 如何检索 Matplotlib savefig() 函数支持的文件格式列表?

python - 我编写的 C 扩展 Python 崩溃并显示 "Abort trap: 6"

Java比较速度

html - 如何从网站中删除未使用的CSS/JavaScript?

javascript - 更改对 JSON 对象的调用以使程序更加抽象

python - 在 geopandas 中移动阿拉斯加和夏威夷以获得 choropleths

interpreter - 更改对象在解释器中的显示方式

python - 安装 shapefile/shapelib 未通过 conda 或 pip 找到

python - 在python中的地理数据中查找圆圈内的所有坐标