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

2024-03-09

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

  1. 使用以下命令获取两点之间的距离(以米为单位)大圆距离 http://en.wikipedia.org/wiki/Great-circle_distance(不是线性距离计算)
  2. 检查点是否在多边形内部
  3. 每秒执行 1 和 2 数千次

一开始我看了这篇文章:用于存储和查询地理坐标的Python模块 https://stackoverflow.com/questions/9078776/python-module-for-storing-and-querying-geographical-coordinates并开始使用geopy http://code.google.com/p/geopy/wiki/GettingStarted。 我遇到了两个问题:

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

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


UPDATE

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

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


UPDATE 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 https://github.com/hoonto/pygeometry

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

http://people.sc.fsu.edu/~jburkardt/cpp_src/geometry/geometry.html 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 次调用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

支持大圆距离和多边形的快速Python GIS库 的相关文章

随机推荐