Hola, descubrimos la respuesta a tu interrogante, continúa leyendo y la hallarás aquí.
Solución:
Uno de los paquetes de los que depende Geopandas es Shapely. Shapely utiliza coordenadas cartesianas 2D (x, y) y los cálculos se realizan en un plano 2D.
Si usa “sistema de coordenadas proyectadas”, no hay problema. La distancia que obtienes es la distancia en el mapa (no en la tierra esférica). Cuando utilice el “sistema de coordenadas geográficas – GCS”, la distancia que obtenga será la distancia más corta en el espacio 3D.
Por lo tanto, debe usar una fórmula para calcular la distancia en la esfera, y esa es la fórmula de Haversine. Pero calcula la distancia de gran círculo entre dos puntos en una esfera dadas sus longitudes y latitudes. Sin embargo, tienes un punto y un polígono. Por lo tanto, necesita un punto en el polígono que tenga la distancia más cercana al punto.
Supongo que las coordenadas del polígono del condado están en GCS, no proyectadas. Si está proyectado, debe transformarse a GCS usando .to_crs()
método. Luego use ese código para encontrar las coordenadas del punto más cercano en el polígono. (Referencia del código: encontrar la coordenada del punto más cercano en Polygon Shapely)
from shapely.geometry import LinearRing
pol_ext = LinearRing(county.geometry.exterior.coords)
d = pol_ext.project(point.geometry)
p = pol_ext.interpolate(d)
closest_point_coords = list(p.coords)[0]
Y luego, use la función a continuación para calcular la distancia esférica que necesita. (Referencia de código: fórmula Haversine en Python)
from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 3956 # Radius of earth in miles. Use 6371 for kilometers
return c * r
Debe reproyectar sus marcos de geodatos en un CRS que conserve adecuadamente las distancias; UTM es una opción común y los resultados estarían en metros. Debe determinar qué zona UTM usar, encontrar la EPSG apropiada y luego usar la .to_crs(epsg=XXXX)
en sus geodataframes para convertirlos.
Elegir el CRS correcto en muchos casos no es trivial; Acabo de proporcionar un punto de partida que puede funcionar para usted. Las proyecciones UTM no conservan las distancias, pero en áreas pequeñas, la distorsión suele ser aceptable. El Plate Caree aparentemente conserva las distancias (epsg 32662).
Aquí puedes ver las reseñas y valoraciones de los usuarios
Puedes añadir valor a nuestra información participando con tu experiencia en las referencias.