Shapely capovolge lat / long coordinate

Oct 16 2020

Ho un dataframe panda contenente un oggetto di geometria Shapely. L'oggetto ben fatto (cerchio) è stato calcolato dal seguente SOhttps://stackoverflow.com/questions/27431528/find-the-intersection-between-two-geographical-data-points, dove ho lat, long e radius come input.

import pandas as pd
from shapely.geometry import Point
from shapely.ops import transform
import pyproj
from functools import partial

WGS84 = pyproj.Proj('epsg:4326')

def latlonbuffer(lat, lon, radius_m):
    proj4str = '+proj=aeqd +lat_0=%s +lon_0=%s +x_0=0 +y_0=0' % (lat, lon)
    AEQD = pyproj.Proj(proj4str) # azimuthal equidistant
    project = partial(pyproj.transform, AEQD, WGS84)
    return transform(project, Point(0, 0).buffer(radius_m))

Ad esempio, utilizzando la funzione sopra, ho creato una tabella come di seguito, con una colonna del centroide aggiuntiva

geometry, centroid
POLYGON((26.48306 50.09625, 26.47916 50.09604, ..)), ((26.48307336330026, 50.052005610561245))

Ma quando converto questa tabella in geopanda e la tracciamo su mplleaflet

import geopandas as gpd
import mplleaflet
import matplotlib.pyplot as plt

df_gpd = gpd.GeoDataFrame(df)
ax = df_gpd.plot(figsize=(20,20), color='r')

mplleaflet.display(fig=ax.figure)

mostra il poligono in una posizione diversa da quella prevista.

Di seguito è riportato ciò che viene tracciato

E questa è la posizione del baricentro del cerchio previsto

Ho capito che anche se il Poligono mostra le coordinate in formato (lat, long), quando mplleaflet sta tracciando, scambia le coordinate in (long, lat).

L'oggetto Polygon contiene le coordinate in formato (long, lat) e mplleaflet sta capovolgendo le coordinate per tracciarlo correttamente sulla mappa?

Il risultato che mi aspetto è un cerchio centrato attorno al centroide (26.48307336330026, 50.052005610561245) che è in formato (lat, long).

tldr: Vorrei sapere se mplleaflet capovolge le coordinate su (long, lat) quando si traccia un oggetto Polygon in Geopandas o se l'oggetto Polygon utilizzando la funzione latlonbuffer()risulta in formato (long, lat).

Aggiornamento :

Il problema era con pyproj che capovolgeva le coordinate durante la trasformazione. Possiamo mantenere l'oggetto Polygon allo standard GIS (long, lat) aggiungendo always_xy = True nel parametro di trasformazione.

import pandas as pd
from shapely.geometry import Point
from shapely.ops import transform
import pyproj
from functools import partial

WGS84 = pyproj.Proj('epsg:4326')

def latlonbuffer(lat, lon, radius_m):
    proj4str = '+proj=aeqd +lat_0=%s +lon_0=%s +x_0=0 +y_0=0' % (lat, lon)
    AEQD = pyproj.Proj(proj4str) # azimuthal equidistant
    project = partial(pyproj.transform, AEQD, WGS84, always_xy=True)
    return transform(project, Point(0, 0).buffer(radius_m))

Usando questo si ottiene

POLYGON((50.09625 26.48306, 50.09604 26.47916, ..))

che può essere tracciato direttamente utilizzando mplleaflet senza invertire le coordinate.

Risposte

4 snowman2 Oct 16 2020 at 10:56

Credo che il problema sia dovuto alle modifiche dell'ordine degli assi in PROJ:

https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6