Estoy escribiendo algo de python para crear líneas de cuadrícula, ya sea como una serie de LINESTRING densificados o un conjunto de MULTIPOINTs.
El código utiliza shapely, y estoy escribiendo WKT en un CSV e importándolo en QGIS(2.18.3) como un archivo delimitado. Estoy ejecutando esto en un entorno virtual de python con lo siguiente (salida de pip freeze)
Fiona==1.7.5
Pillow==4.1.0
Shapely==1.5.17
click==6.7
click-plugins==1.0.3
cligj==0.4.0
munch==2.1.1
numpy==1.12.1
olefile==0.44
psycopg2==2.7.1
pyproj==1.9.5.1
six==1.10.0
El código es el siguiente:-
from shapely.geometry import MultiPoint, LineString
def graticule(long_degrees=10, lat_degrees=10, segments=1000,
geometry_type=MultiPoint):
"""
Generador. Emite una serie de geometrías
:param long_degrees: separación de longitud
:param lat_degrees: separación de latitud
:param segments: número de segmentos (valores más grandes = más suavidad)
:param geometry_type: tipo de geometría (MultiPoint, Linestring)
:return: genera formas. Depende del cliente iterar sobre estas
"""
# meridianos
for long in range(-180,180,long_degrees):
coords = []
longitud = float(long)
for lat_step in range(0, segments):
latitud = float(90.0-(lat_step*(180.0/segments)))
coords.append((longitud, latitud))
yield geometry_type(coords)
# latitudes
for lat in range(-90,90,lat_degrees):
coords = []
latitud = float(lat)
for long_step in range(0, segments):
longitud = float(-180.0+(long_step*(360.0/segments)))
coords.append((longitud, latitud))
yield geometry_type(coords)
def main():
"""
Crea una cuadrícula de 10 grados como un archivo WKT CSV
:return:
"""
with open("/tmp/foo.csv","w") as output_file:
output_file.write("GEOM\n")
for geom in graticule(10,10,1000,MultiPoint):
output_file.write("{}\n".format(geom.wkt))
print("¡Terminado!")
if __name__ == "__main__":
main()
Funciona perfectamente cuando elijo LineString como el geometry_type...
pero cuando elijo Multipoint, solo veo cosas al este del Meridiano de Greenwich. Y las líneas de latitud desaparecen por completo.
¿Alguien tiene idea de qué está pasando aquí? He mostrado el uso de la proyección de Bonne, pero también sucede con el antiguo wgs84. También he intentado ordenar los multipuntos para que vayan de norte a sur, pero el resultado es el mismo :/
No se lanzaron errores.
0 votos
Es genial que funcione con cadenas de líneas. ¿Esperas que QGIS renderice los puntos múltiples como líneas?
0 votos
Los multipuntos se representan como puntos discretos, simplemente los estilicé muy pequeños para que parezcan líneas continuas (nota: hago esto para mejorar la apariencia de las rejillas en proyecciones polares, donde las rejillas pueden parecer un poco "cuadradas" en el compositor). Me pregunto si es un problema de "meridiano" (por ejemplo, -180).
0 votos
@StevenKay, ¡escribiste un código muy bueno! ¿Estás restringido a usar shapely o puedo eventualmente pensar en otra solución (con PyQGIS, OGR, etc)?