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

时间:2014-12-11 20:09:25

标签: python geolocation shapely utm

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

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)

SOLUTION:

所以,我终于设法解决了我的问题。以下是两个不同的实现,它们都解决了同样的问题:

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)))

1 个答案:

答案 0 :(得分:2)

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

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

    ,如何做#2
    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
    

    如通过绘制lon / lat坐标(扭曲圆圈)所示:

    img