Tutorial para transformar Sistemas de Coordenadas de Puntos XY con Python Pandas y Pyproj

translateCoordinates.png

La información espacial está vinculada a la posición y a un sistema de referencia. Existen muchos sistemas de coordenadas en todo el mundo con diferentes unidades de longitud, proyecciones y orígenes. De alguna manera, el análisis espacial siempre está vinculado a la información almacenada en diferentes sistemas de coordenadas y tenemos que proporcionar formas efectivas de traducirlos a un CRS (sistema de referencia de coordenadas) específico.

Hemos desarrollado un tutorial para la traducción del sistema de coordenadas de puntos XY almacenados en tablas. El tutorial muestra el procedimiento para cambiar los sistemas de coordenadas de tipo geográficas y proyectadas utilizando la librería Pyproj sobre un Pandas dataframe en un Jupyter notebook.


Datos de entrada

Puede descargar todos los datos de este tutorial de este enlace.

Código

Este es el código completo en Python:

Original data from: Hydrogeologic Framework of the Treasure Valley and Surrounding Area, Idaho and Oregon; Well Data https://www.sciencebase.gov/catalog/item/5d83cf8ce4b0c4f70d06f0d3

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Open input files

wellLoc = pd.read_csv('../inputData/TV-HFM_Wells_1Location.csv',header=1,index_col=0,usecols=[0,2,3,4,5])
wellLoc.head()
Easting Northing dd_lon dd_lat
Bore
A. Isaac 2333140.95 1372225.65 -116.065033 43.532316
A. Woodbridge 2321747.00 1360096.95 -116.201976 43.420553
A.D. Watkins 2315440.16 1342141.86 -116.273786 43.257477
A.L. Clark; 1 2276526.30 1364860.74 -116.761968 43.451284
A.L. Clark; 2 2342620.87 1362980.46 -115.945106 43.451176

Transform coordinate system - Geographical

from pyproj import Transformer
transformer = Transformer.from_crs('epsg:4269','epsg:4326',always_xy=True)
points = list(zip(wellLoc.dd_lon,wellLoc.dd_lat))
coordsWgs = np.array(list(transformer.itransform(points)))
coordsWgs[:5,:]
array([[-116.065033,   43.532316],
       [-116.201976,   43.420553],
       [-116.273786,   43.257477],
       [-116.761968,   43.451284],
       [-115.945106,   43.451176]])
wellLoc['lonWgs']=coordsWgs[:,0]
wellLoc['latWgs']=coordsWgs[:,1]
wellLoc.head()
Easting Northing dd_lon dd_lat lonWgs latWgs
Bore
A. Isaac 2333140.95 1372225.65 -116.065033 43.532316 -116.065033 43.532316
A. Woodbridge 2321747.00 1360096.95 -116.201976 43.420553 -116.201976 43.420553
A.D. Watkins 2315440.16 1342141.86 -116.273786 43.257477 -116.273786 43.257477
A.L. Clark; 1 2276526.30 1364860.74 -116.761968 43.451284 -116.761968 43.451284
A.L. Clark; 2 2342620.87 1362980.46 -115.945106 43.451176 -115.945106 43.451176

Plot transformed coordinates

# with matplotlib
figure = plt.figure(figsize=(10,12))
plt.scatter(wellLoc.lonWgs, wellLoc.latWgs, s=15, c='goldenrod')
plt.show()
output_8_0.png
# with mplleaflet over a section of points
wellLocCut = wellLoc[wellLoc.lonWgs.between(-116.4,-116.0)][wellLoc.latWgs.between(43.4,43.8)]

import mplleaflet
tiles=('http://mt0.google.com/vt/lyrs=s&hl=en&x=', 
       '<a href=https://www.openstreetmap.org/about">© OpenStreetMap</a>')
wellCrs = 
figure = plt.figure(figsize=(10,12))
plt.scatter(wellLocCut.lonWgs, wellLocCut.latWgs, s=30, c='orangered')
mplleaflet.display(crs=wellCrs,tiles=tiles)

C:\Users\Gida\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: UserWarning: Boolean Series key will be reindexed to match DataFrame index.

C:\Users\Gida\Anaconda3\lib\site-packages\IPython\core\display.py:694: UserWarning: Consider using IPython.display.IFrame instead
  warnings.warn("Consider using IPython.display.IFrame instead")

Transform coordinate system - Transverse Mercator

from pyproj import Transformer
transformer = Transformer.from_crs('esri:102605','epsg:32611',always_xy=True)
points = list(zip(wellLoc.Easting,wellLoc.Northing))
coordsWgsUTM = np.array(list(transformer.itransform(points)))
coordsWgsUTM[:5,:]

array([[ 575546.62883411, 4820354.91361594],
       [ 564600.3665819 , 4807827.44742112],
       [ 558944.8434037 , 4789663.81991337],
       [ 519259.00615917, 4810958.61748012],
       [ 585351.15027036, 4811459.50309812]])

wellLoc['EastingUTM']=coordsWgsUTM[:,0]
wellLoc['NorthingUTM']=coordsWgsUTM[:,1]

figure = plt.figure(figsize=(10,12))
plt.scatter(wellLoc.EastingUTM, wellLoc.NorthingUTM, s=30, c='orangered')

<matplotlib.collections.PathCollection at 0x1ee319cd198>
output_13_1.png

Export CSV with transformed coordinates

### Export dataframe as CSV
wellLoc.to_csv('../outputData/TV-HFM_Wells_1Location_trans.csv')

Video

Control de proyección

Todas las coordenadas originales y traducidas se representaron en QGIS para mostrar la precisión / idoneidad de la traducción del sistema de coordenadas. Las siguientes capturas de pantalla muestran que la ubicación del punto es la misma independientemente del sistema de coordenadas.

screenshot1.PNG
screenshot2.PNG


 

Suscríbete a nuestro boletín electrónico

Suscríbase a nuestro boletín gratuito para recibir noticias, datos interesantes y fechas de nuestros cursos en recursos hídricos.

 

Posted on February 4, 2020 and filed under TutorialQGIS.