viernes, 24 de noviembre de 2017

Moviendo geometría con Python shapely

El código siguiente usa el método 'translate', de shapely.affinity, para mover una geometría que está solapando dos linestrings (ver imagen siguiente) desde init_point hasta final_point; ambos especificados en el código.

 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
29
30
import fiona
from shapely.geometry import shape
from shapely.affinity import translate

path_line = '/home/zeito/pyqgis_data/linestring.shp'
path_box = '/home/zeito/pyqgis_data/box.shp'

line_file = fiona.open(path_line)
box_file = fiona.open(path_box)

lines = [ feat["geometry"] for feat in line_file ]
box = [ feat["geometry"] for feat in box_file ]


geom_line = [ shape(line) for line in lines ]

geom_box = shape(box[0])

init_point = (414292.587778, 4469753.3899)
final_point = (411712.772831, 4463873.81165)

xoff =  final_point[0] - init_point[0]
yoff =  final_point[1] - init_point[1]

new_geom_box = translate(geom_box, xoff= xoff, yoff= yoff)

print new_geom_box

for geom in geom_line:
    print geom.intersection(new_geom_box)

Antes de ejecutar el código anterior el sistema luce como en la imagen a continuación:


Después de ejecutado el código en la Python Console de QGIS se imprimieron las geometrías siguientes:

1
2
3
POLYGON ((410112.616106789 4462767.206057594, 410112.616106789 4464975.827552281, 413712.3030732681 4464975.827552281, 413712.3030732681 4462767.206057594, 410112.616106789 4462767.206057594))
LINESTRING (411526.0185637082 4464975.827552281, 410528.5765983656 4462767.206057594)
LINESTRING (412896.2136284537 4464975.827552281, 412692.4310537892 4464497.99254962, 411865.7867590904 4462767.206057594) 

las cuales fueron visualizadas con la ayuda del plugin QuickWKT de QGIS. Allí se observa (ver imagen siguiente) que la bounding box original (verde) fue efectivamente desplazada hasta el punto final (magenta). Además, el código permitió también obtener cada porción de la linestring original que intersecta con la bounding box en esta nueva posición.


No hay comentarios: