【问题标题】:Distance between a point and a MultiPolygon Geoseries object in PythonPython中点和MultiPolygon Geoseries对象之间的距离
【发布时间】:2019-03-15 04:55:11
【问题描述】:

我想计算一个点与使用 GeoPandas 的 cascaded_union 函数创建的 Multiploygon geoseries 对象的距离。以下是我的代码:

import numpy as np
import pandas as pd
import geopandas as gpd
from shapely.ops import cascaded_union
from matplotlib import pyplot as plt
from shapely.geometry import LineString, Point, MultiPoint

fp = "\\TM_WORLD_BORDERS-0.3\\TM_WORLD_BORDERS-0.3.shp"
data = gpd.read_file(fp)

mycountries = ['Canada','Russia']

req_data = data[data.NAME.isin(mycountries)]
req_data = req_data.reset_index()
req_data = req_data.drop('index',axis=1)

polygons = [req_data['geometry'][0],req_data['geometry'][1]]
boundary = gpd.GeoSeries(cascaded_union(polygons))
boundary.plot(color = 'black')
plt.show()

我要求当我计算一个点与多面体的距离时,它应该考虑最近的国家/多边形,并且距离应该以英里/公里为单位。对此的任何帮助将不胜感激。

我尝试使用距离函数,但得到的结果不正确。此外,如果我考虑印度洋某处的某个点,它给出的结果为 0,这又不是我所需要的。

形状文件可以从 http://thematicmapping.org/downloads/world_borders.php

上的 TM_WORLD_BORDERS-0.3.zip 文件下载

【问题讨论】:

  • 如何定义从一个点到一个多面体的距离?
  • 我将点到多面体的距离定义为该点与多面体平面中存在的最近多边形边界上的最近点之间的最小距离。我希望这能回答你的问题。

标签: python polygon distance geopandas shapely


【解决方案1】:

这里有一个使用 Point.distance 的解决方案:

from shapely.geometry import Point
point = Point(34.23, 86.44)
dist={}
for index, row in req_data.iterrows():
    if row.geometry.geom_type == 'MultiPolygon':
        for  r in row.geometry:
            print(row.NAME,'  dist', point.distance(r))
            if row.NAME in dist:
                l = dist[row.NAME];l.append(point.distance(r))
                dist[row.NAME] = l
            else:
                dist[row.NAME] = [point.distance(r)]
    else: #Polygon
        print(row.NAME,'  dist', point.distance(row.geometry))
        dist[row.NAME] = [point.distance(row.geometry)]


for x in dist:
    print(x, min(dist[x]))

输出:与每个国家/地区的最小距离

 Canada 95.0619464401356
 Russia 12.118509615115519

【讨论】:

  • 我正在尝试计算与点 (52.2605,-50.581) 的距离。理想情况下,这一点非常接近加拿大,但我得到的答案是加拿大:143.34 和俄罗斯:91.88。另外,我假设距离是度数和 1 度 ~ 69 英里。对吗?
  • 距离是 60 海里 1 度,这是一个近似值,因为计算出的距离是世界正交投影的欧几里得距离(您正在使用)。如果您想要更高的精度,则必须以笛卡尔坐标 (x,y,z) 转换所有点 (lat,long)。但这意味着将你所有的多面体转换为多边形,最后转换为点 -> 很长很长时间......
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
相关资源
最近更新 更多