1 votos

Error de trazado de Geopandas y Matplotlib

enter image description here

Estoy intentando trazar un punto sobre un shapefile. Las coordenadas del punto son exactas. Lo verifiqué utilizando la herramienta de ir a XY de ArcMap. pero cuando trato de trazar la superposición utilizando Python la ubicación de ambos se distorsiona.

loc =gpd.read_file(r'C:\Users\MJ\Desktop\populationFunc\rentalRtes\resapart\gurgaonGISdata\locGISd.shp')
loc = loc.to_crs(epsg = 32643)
loc.plot(figsize = (10,10))
lat =  28.44198794960
long = 77.07818660830
p1 = Point((long, lat))
df = pd.DataFrame({'a':[lat,long]})
po = gpd.GeoDataFrame(geometry = [p1], crs = loc.crs)
po = po.to_crs(epsg = 32643)
po.plot()
fig,ax = plt.subplots(figsize = (15,7))
loc.plot(ax=ax, color = 'none', edgecolor = 'black')
po.plot(ax= ax)`

1voto

Tri Trinh Puntos 11

Esto se debe a que se cambia el loc.crs y luego hacer referencia a ella. Lo siguiente debería funcionar:

loc =gpd.read_file(r'C:\Users\MJ\Desktop\populationFunc\rentalRtes\resapart\gurgaonGISdata\locGISd.shp')
loc = loc.to_crs(epsg = 32643)
loc.plot(figsize = (10,10))

lat =  28.44198794960
long = 77.07818660830
p1 = Point((long, lat))
df = pd.DataFrame({'a':[lat,long]})
po = gpd.GeoDataFrame(geometry = [p1], crs = loc.crs)

loc = loc.to_crs(epsg = 32643)
loc.plot(figsize = (10,10))
po = po.to_crs(epsg = 32643)
po.plot()
fig,ax = plt.subplots(figsize = (15,7))
loc.plot(ax=ax, color = 'none', edgecolor = 'black')
po.plot(ax= ax)`

Nota: Intente no utilizar rutas codificadas en una cadena. Echa un vistazo a Pathlib

1voto

GreyCat Puntos 146

No conozco la proyección original de loc, ni el contenido del GeoDataFrame, pero si se fija la nueva proyección de loc, la proyección es epsg:32643 (en metros)

 loc = loc.to_crs(epsg = 32643)
 print(loc.crs)
 epsg:32643

La unidad de EPSG:32643 es un metro y no un grado (long,lat), por lo tanto

lat =  28.44198794960 #in degree
long = 77.07818660830 #in degree
p1 = Point(long, lat)
po = gpd.GeoDataFrame(geometry = [p1],crs = "EPSG:4326") #in degrees
print(po)
      geometry
0  POINT (77.07819 28.44199)
 print(po.crs)
 EPSG:4326

# conversion to meters
po = po.to_crs(epsg = 32643) # in meters
print(po)
               geometry
0  POINT (703517.314 3147923.581)
print(po.crs)
EPSG:32643

Con su solución

po = gpd.GeoDataFrame(geometry = [p1],crs = "EPSG:32643") #in meters
print(po)
            geometry
0  POINT (77.07819 28.44199)
print(po.crs)
EPSG:32643

parcela:

fig, ax = plt.subplots(figsize=(6,6))
ax.plot(*po.geometry[0].xy,'o')
ax.axis('equal')
plt.show()

enter image description here

-1voto

Pierre Alvarez Puntos 678

Gracias, chicos. El problema era con la proyección. Cambié la proyección de GCS a PCS para todos los archivos y el problema se resolvió.

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