Saltar al contenido

Calcula la distancia entre una coordenada y un condado en GeoPandas

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.

ingrese la descripción de la imagen aquí

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *