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