Расстояние между точкой и объектом MultiPolygon Geoseries в Python

Я хочу рассчитать расстояние точки от объекта геосерии Multiploygon, созданного с использованием функции cascaded_union GeoPandas. Ниже приведен мой код:

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, что опять же не то, что мне нужно.

Файл формы можно загрузить из файла TM_WORLD_BORDERS-0.3.zip, доступного по адресу http://thematicmapping.org/downloads/world_borders.php


person ansmal    schedule 15.03.2019    source источник
comment
Как определить расстояние от точки до мультиполигона?   -  person swatchai    schedule 15.03.2019
comment
Я определяю расстояние от точки до мультиполигона как минимальное расстояние между точкой и ближайшей точкой на границе ближайшего многоугольника, присутствующего в плоскости мультиполигона. Надеюсь, это ответ на ваш вопрос.   -  person ansmal    schedule 16.03.2019


Ответы (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
person Frenchy    schedule 17.03.2019
comment
Я пытаюсь рассчитать расстояние от точки (52.2605,-50.581). В идеале эта точка очень близка к Канаде, но я получаю ответ: Канада: 143,34 и Россия: 91,88. Кроме того, я предполагаю, что расстояние указано в градусах и 1 градус ~ 69 миль. Верно? - person ansmal; 18.03.2019
comment
Расстояние составляет 60 морских миль на 1 градус, это приближение, потому что расчетное расстояние является евклидовым расстоянием ортогональной проекции мира (вы используете). Если вам нужна более высокая точность, вам нужно преобразовать все точки (широта, долгота) в декартову координату (x, y, z). А это значит превратить все ваши мультиполигоны в полигоны и в конце концов в точки -› долго очень, долго.... - person Frenchy; 18.03.2019