martes, 15 de agosto de 2017

Creación de buffer en coordenadas geográficas con shapely y pyproj

Por alguna razón, varios usuarios de SIGs se rehusan a reprojectar su data en coordenadas geográficas a proyecciones en metros (o pies) y luego, cuando se ven en la necesidad de determinar algunas propiedades geométricas (áreas, longitudes) o producir cierto tipo de capas como los buffer, se les presentan dificultades.

En el caso de los buffer, si se trabaja con coordenadas geográficas, es necesario pasar previamente las geometrías a coordenadas proyectadas y luego, una vez obtenida, reproyectar al sistema de origen.

En el código siguiente, un punto (-112.171129818, 40.1731054115) arbitario (long/lat WGS84) en el estado de Utah (USA) se va proyectar a UTM/12N WGS84 (EPSG:32612) mediante el módulo Python pyproj, posteriormente se va producir un buffer de 1000 m alrededor de ese punto para finalmente reproyectarlo nuevamente a las coordenadas geográficas de origen. Las geometrías se van a manipular mediante el módulo Python shapely y el buffer obtenido, en formato WKT, se visualiza con el plugin QuickWKT de QGIS.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from shapely.geometry import Point, Polygon

import pyproj

srcProj = pyproj.Proj(init='EPSG:4326')
dstProj = pyproj.Proj(init='EPSG:32612')

pt = (-112.171129818, 40.1731054115)

x, y = pyproj.transform(srcProj, dstProj, pt[0], pt[1])

pt = Point(x,y)

buffer = pt.buffer(1000)

buffer_points =  zip(buffer.exterior.coords.xy[0], buffer.exterior.coords.xy[1])

proj_buffer_points = []

for point in buffer_points:
    x = point[0]
    y = point[1]
    x, y = pyproj.transform(dstProj, srcProj, x, y)
    proj_buffer_points.append((x, y))

print Polygon(proj_buffer_points)

    

Después de ejecutado el código en consola de bash, el plugin de visualización QuickWKT arrojó el resultado a continuación; con un buffer que presenta una forma elipsoidal.


No obstante, cuando se activa la reproyección al vuelo escogiendo el CRS con EPSG:32612, correspondiente a UTM/12N WGS84, se observa que el buffer es perfectamente circular; tal como se esperaba.



No hay comentarios: