python - 找到两个地理数据点之间的交集

标签 python geolocation shapely utm

我有两对纬度/经度(以十进制表示)及其半径(以米表示)。我想要实现的是找出这两个点之间是否存在交集(当然,很明显这在这里不成立,但计划在许多其他数据点中尝试该算法)。为了检查这一点,我使用了 Shapely 的 intersects() 函数。然而,我的问题是我应该如何处理不同的单位?我是否应该先进行某种转换\投影(纬度\经度和半径的单位相同)?

48.180759,11.518950,19.0
47.180759,10.518950,10.0

编辑:

我在这里 ( https://pypi.python.org/pypi/utm ) 找到了这个库,它看起来很有帮助。但是,我不能 100% 确定我是否正确应用了它。有什么想法吗?

X = utm.from_latlon(38.636782, 21.414384)
A = geometry.Point(X[0], X[1]).buffer(30.777)
Y = utm.from_latlon(38.636800, 21.414488)
B = geometry.Point(Y[0], Y[1]).buffer(23.417)
A.intersects(B)

解决方案:

所以,我终于设法解决了我的问题。这里有两个不同的实现,它们都解决了同一个问题:

X = from_latlon(48.180759, 11.518950)
Y = from_latlon(47.180759, 10.518950)

print(latlonbuffer(48.180759, 11.518950, 19.0).intersects(latlonbuffer(47.180759, 10.518950, 19.0)))
print(latlonbuffer(48.180759, 11.518950, 100000.0).intersects(latlonbuffer(47.180759, 10.518950, 100000.0)))

X = from_latlon(48.180759, 11.518950)
Y = from_latlon(47.180759, 10.518950)

print(geometry.Point(X[0], X[1]).buffer(19.0).intersects(geometry.Point(Y[0], Y[1]).buffer(19.0)))
print(geometry.Point(X[0], X[1]).buffer(100000.0).intersects(geometry.Point(Y[0], Y[1]).buffer(100000.0)))

最佳答案

Shapely 仅使用 Cartesian coordinate system ,所以为了理解公制距离,您需要:

  1. 将坐标投影到使用以米为单位的距离单位的本地投影系统,例如 UTM 带。
  2. 从 (0,0) 开始缓冲一个点,并使用动态 azimuthal equidistant projection以纬度/经度点为中心以投影到地理坐标。

这是#2 的方法,使用 shapely.ops.transformpyproj

import pyproj
from shapely.geometry import Point
from shapely.ops import transform
from functools import partial

WGS84 = pyproj.Proj(init='epsg:4326')

def latlonbuffer(lat, lon, radius_m):
    proj4str = '+proj=aeqd +lat_0=%s +lon_0=%s +x_0=0 +y_0=0' % (lat, lon)
    AEQD = pyproj.Proj(proj4str)
    project = partial(pyproj.transform, AEQD, WGS84)
    return transform(project, Point(0, 0).buffer(radius_m))

A = latlonbuffer(48.180759, 11.518950, 19.0)
B = latlonbuffer(47.180759, 10.518950, 10.0)
print(A.intersects(B))  # False

您的两个缓冲点不相交。但这些确实:

A = latlonbuffer(48.180759, 11.518950, 100000.0)
B = latlonbuffer(47.180759, 10.518950, 100000.0)
print(A.intersects(B))  # True

如绘制经/纬度坐标(扭曲圆圈)所示:

img

关于python - 找到两个地理数据点之间的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27431528/

相关文章:

python 删除数组中的空对象

python - Pandas csv itertools 组合

python - 在 Google App Engine 上用 Python 计算城市之间的距离并基于 GeoPT 查找周边城市

python - matplotlib 艺术家中的多边形包含测试

python - 对 geopandas 中相交/重叠的几何图形进行分组和组合

python - 如何找到多边形内的点?

python - 如何在列表中创建列表,其中每个 future 列表都由列表中的空格分隔

node.js - Elasticsearch node.js geo_distance 过滤器

javascript - html5 地理定位不适用于 safari 浏览器

python - 在文本文件中的某些单词后提取数字