Координата ближайшей точки многоугольника в Shapely - PullRequest
0 голосов
/ 04 августа 2020

Если у меня есть многоугольник и точка внутри многоугольника, как мне найти координаты ближайшей точки на многоугольнике?

Отредактировано: приведенный ниже код изменен на основе другого сообщения . Я пытаюсь найти ближайшую точку на многоугольнике (береговой линии) к заданной точке внутри этого многоугольника, но результат кажется неверным. Например, на этом изображении , красная точка - это случайная начальная координата, а синяя точка - ближайшая точка многоугольника (береговая линия), которую я получил из измененного кода. Что мне здесь не хватает?

from shapely.geometry import Point
import geopandas as gpd
from cartopy.io import shapereader as shp_r
from shapely.ops import nearest_points
import pandas as pd
import geoplot as gplt
import matplotlib.pyplot as plt


# Random point in the U.K (close to the south coast, Worthing)
long, lat = 50.907262, -0.420036
p0 = Point(long, lat) 

#10m resolution country data
resolution = '10m'
category = 'cultural'
name = 'admin_0_countries'
shpfilename = shp_r.natural_earth(resolution, category, name)
world_pd = gpd.read_file(shpfilename)

# Filter out United Kingdom
country_name = 'United Kingdom'
country_pd = world_pd[world_pd['ADMIN'] == country_name]


# Extract mainland as single Polygon (otherwise contains a MultiPolygon)
uk_main_landmass = country_pd['geometry'].iloc[0].geoms[1]
print (type(uk_main_landmass)) #Out: shapely.geometry.polygon.Polygon

#Plot polygon
m = gpd.GeoSeries(uk_main_landmass.boundary)
# m.plot()

#Calculate the nearest point on the polygon to the input point (p0)
p1, p0 = nearest_points(uk_main_landmass.boundary, p0)
print (list(p1.coords)) #Near Dover?

nearest_lat, nearest_long   = (p1.coords)[0] #Long and lat are swapped? 

#Create geopandas dataframes for random starting point
df_start = pd.DataFrame(
    {'Latitude': [long],
     'Longitude': [lat]})
start = gpd.GeoDataFrame(
    df_start, geometry=gpd.points_from_xy(df_start.Longitude, df_start.Latitude))

#Create geopandas dataframes for nearest point on polygon (coastline)
df_nearest = pd.DataFrame(
    {'Latitude': [nearest_long],
     'Longitude': [nearest_lat]})
nearest = gpd.GeoDataFrame(
    df_nearest, geometry=gpd.points_from_xy(df_nearest.Longitude, df_nearest.Latitude))

#Shows start point (red) and new "closest point" (blue) on coastline
ax = gplt.polyplot(country_pd, figsize=(12, 12))
start.plot(ax = ax, color = 'red')
nearest.plot(ax = ax, color = 'blue')
plt.show()
...