1 votos

geoJSON al parámetro geodésico shapely

Mi objetivo es convertir un featureCollection del motor de google earth en un geodataframe de geopandas.

El motor Earth puede manejar geoJSON mientras que geopandas prefiere shapely.

La geometría (geoJSON) de la primera característica de mi featureCollection es:

https://pastebin.com/FSWFpBu4

como puedes ver, hay un parámetro geodésico (booleano) en el geoJSON.

Utilizo shapely.geometry.shape() para convertir el geoJSON en una geometría shapely que pueda manejar geopandas. Sin embargo, no estoy seguro de si el parámetro geodésico se captura correctamente. El shapely documentación no menciona esto. [EDIT: la página principal sí lo menciona] ¿Cómo puedo asegurarme de que el parámetro geodésico se maneja correctamente?

Aquí está mi función completa:

def fcToGdf(fc):
    """converts a featurecollection to a (geo)Pandas GeoDataFrame or a pandas DataFrame. WARNING: Geometries are non-geodesic. Geodesic not yet supported. work in progress

    Args:
        fc (ee.FeatureCollection) : the earth engine feature collection to convert. Size is limited to memory (geopandas limitation)
        crs (dictionary, optional) : the coordinate reference system in geopandas format. Defaults to {'init' :'epsg:4326'}

    Returns:
        gdf (geoPandas.GeoDataFrame or pandas.DataFrame) : the corresponding (geo)dataframe. 

    """
    crs = {'init' :'epsg:4326'}

    features = fc.getInfo()['features']
    dictarr = []

    for f in features:
        attr = f['properties']
        attr['geometry'] = f['geometry']  
        dictarr.append(attr)

    gdf = gpd.GeoDataFrame(dictarr)
    gdf['geometry2'] = map(lambda s: shapely.geometry.shape(s), gdf.geometry)
    gdf.crs = crs
    return gdf

1voto

thecohenoam Puntos 14

shapely sólo maneja la geometría en el plano cartesiano. La página web proyecto es explícito al respecto. Seguramente ha visto que no hay propiedades del sistema de referencia espacial para shapely Geometrías. Con eso, creo que puedes absolver shapely del requisito de mantener las propiedades geodésicas.

edición: el siguiente párrafo original es incorrecto

geopandas debe manejar correctamente las propiedades geodésicas, es decir, el arco/línea que conecta dos vértices adyacentes de una geometría poligonal debe caer en un gran círculo. Mientras que shapely sólo maneja la geometría cartesiana, geopandas tiene buenas capacidades para manejar sistemas de referencia espacial (incluidos los sistemas de coordenadas geodésicas) a través de su uso de pyproj .

EDITAR

Buscando en la especificación GeoJSON RFC 7946 Hay instrucciones explícitas que dicen:

Una línea entre dos posiciones es una línea cartesiana recta, la línea más corta entre esos dos puntos en el sistema de referencia de coordenadas de coordenadas (véase el apartado 4).

En otras palabras, cada punto de una línea que no cruza el antimeridiano entre un punto (lon0, lat0) y (lon1, lat1) puede ser calculado como

F(lon, lat) = (lon0 + (lon1 - lon0) * t, lat0 + (lat1 - lat0) * t)

siendo t un número real mayor o igual a 0 y menor que o igual a 1. Nótese que esta línea puede diferir notablemente de la trayectoria geodésica a lo largo de la superficie curva del elipsoide de referencia.

Con esto queda bastante claro que GeoJSON utiliza para sus cálculos geométricos una malla esférica geodésica desenrollada y deformada (ahora tratada como una malla cartesiana plana). Esto significa, explícitamente, que cuando se maneja un GeoJSON moderno, no se debe esperar una geometría geodésica excepto para el ecuador y cualquier línea de longitud.

Para entender el motor de Google Earth (GEE) geodesic dentro de la definición de la geometría mira sección 6.1 de la especificación, que se refiere a la extensión de los miembros extranjeros. En resumen, GEE geodesic está permitido, pero no se debe esperar la aceptación y el uso de ese miembro en muchas implementaciones y aplicaciones diferentes. Creo que eso es lo que se ve aquí.

Nada de esto quiere decir que geopandas tiene que seguir la especificación GeoJSON de cualquier manera, excepto probablemente para la exportación gdf.to_json() . Me he dado cuenta en tu comentario que cuando trazas el geodataframe probablemente estás usando la representación por defecto, que es la cuadrícula desenrollada y deformada (lon,lat).

Creo que mi respuesta debe ser desmarcada como aceptada para promover que alguien proporcione una mejor solución para encontrar realmente cómo utilizar geometrías geodésicas/grandes círculos en python, geopandas, ...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X