Este post es un pequeño ejemplo de algunas funcionalidades extra que le podemos dar a nuestro módulo de Scripting en gvSIG 2, en este caso crear un visor web con solo un click. Pero primero de todo decir que el script ni esta perfecto ni pretende estarlo, solo quiero demostrar posibles nuevos usos de este módulo y animaros a probar cosas nuevas.
gvsig2leaflet viene de la idea del post que salió recientemente sobre qgis2leaflet un plugin (mucho más completo) para QGIS, pero en un rato que tuve libre quería demostrar que esto también es posible desde gvSIG 2 y directamente con el módulo de Scripting.

Actualmente lo que hace es, desde una vista donde las capas estén en WGS84 y una capa de polígonos(polígonos simples, el problema es que aún no dispongo de un exportador a geojson completo desde scripting) que tengamos activa (con o sin selección), nos genera en una carpeta (que configuramos en las primeras lineas de código) con un archivo index.html (visor de Leaflet) y una carpeta dentro con el archivo js/geojson.js que contendrá los datos vectoriales de nuestros polígonos en formato geojson, pero preparados para ser usado en Leaflet. Hay alguna funcionalidad básica añadida, si modificáis la linea 55 podéis cambiar las propiedades de vuestros polígonos que muestran los popup al hacer click.

El resultado es una carpeta con un visor que podéis abrir o subir a vuestro host y visualizar vuestros datos. La podéis abrir directamente en cualquier navegador.

Añadir más funcionalidades, o exportar diferentes capas a la vez, añadir menus o estilos, sería cuestión de ponerse y programar, pero la posibilidad de hacerlo esta ahí, solo quería demostrar que hay más cosas posibles desde este módulo.
from gvsig import * import os def main(*args): global pathGeojson global pathHtml global path path = "C:/gvsig/geojson/leaflet/" pathGeojson = path + "js/geojson.js" pathHtml = path + "index.html" directorio = os.path.join(path, 'js') if not os.path.isdir(directorio): os.mkdir(directorio) f1 = open(pathHtml,"wb") layer = currentLayer() exportLayer(layer) f1.write(""" <!DOCTYPE html> <html> <head> <title>Prueba</title> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css" /> <script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script> <script type="text/javascript" src="js/geojson.js"></script> </head> <body> <div id="map"></div> <div id="map-div"></div> <style> #map { height: 600px; } </style> """) f1.write(""" <script> var map = L.map('map').setView([%s, %s], 5); L.tileLayer('http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>', minZoom: 3, maxZoom: 15, tms: false }).addTo(map); function onEachFeature(feature, layer) { layer.bindPopup(feature.properties.NAME); } L.geoJson(geojsonFeature, { onEachFeature: onEachFeature }).addTo(map); </script> </body> </html> """ % (40,3)) f1.close() def exportLayer(layer): #features o seleccion if layer.getSelection().getCount() == 0: selection = layer.features() else: selection = layer.getSelection() exportFeatureCollection(selection) def exportFeatureCollection(selection): print "Export Feature Collection" f = open(pathGeojson,"wb") f.write(""" var geojsonFeature = { "type": "FeatureCollection", "features": [ """ ) listVert = [] typeGeom = "" count=0 end= selection.getCount() for sel in selection: geom = sel.geometry() listVert, typeGeom = exportGeom(geom) #todos los atributos a una lista de properties: dic = sel.getValues() properties = [] for di in dic: try: value = str(di) except: value = "field1" try: value2 = str(dic[di]) except: value2 = "row2" properties.append([value,value2]) writeFeatureCollection(listVert, typeGeom, properties, f) count +=1 if not(count == end): f.write(",") f.write(""" ] }; """ ) f.close() def writeFeatureCollection(listVert, typeGeom, properties, f): tipo = '"'+str(typeGeom)+'"' f.write( """ { "type": "Feature", "properties": { """) end = len(properties) start = 0 for prop in properties: prop1 = '"'+str(prop[0])+'"' prop2 = '"'+str(prop[1])+'"' stri = str(prop1) + ":" + str(prop2) f.write(stri) start += 1 if not(start == end): f.write(",") f.write( """ }, "geometry": { "type": """+ tipo +""" , "coordinates": [ """ + str(listVert) + """ ] } } """ ) def exportGeom(geom): print "geometria: ", geom if str(geom) == "Surface2D": typeGeom = "Polygon" vert = geom.getNumVertices() listVert = [] for i in range(0, vert): x = geom.getVertex(i).getX() y = geom.getVertex(i).getY() listVert.append([x,y]) x = geom.getVertex(0).getX() y = geom.getVertex(0).getY() listVert.append([x,y]) return listVert, typeGeom
Espero animaros a que creéis vuestros propios scripts, y si veo la gente animada, me comprometo a acabar mejorando este script para que sea mucho más completo.
Un saludo
Muy trabajado el script Óscar, Felicidades!
Gracias! Más que nada es intentar demostrar el potencial que pueden tener este tipo de scripts. :)
hola como estas , esta super interesante, pero soy nueva en esto y estoy haciendo mi proyecto de grado con gvsig 2.*, necesito saber si es posible , que mas se puede hacer con este script, ya que no conozco si alcance a tener las mismas funcionalidades de mapserver, debido a q necesito hacer una aplicación web para publicar los módulos que se realizaran o porfavor q me aconsejar para realizar las publicaciones, o si definitivamente me devuelvo al 1.1.2 a trabajar desde ahí. gracias
Hola, pues ahora mismo no creo que te sirva este script. Ahora mismo es muy básico y funciona solo en casos muy concretos, como habrás leído en el post, no creo que te sirva para mostrar toda la información que necesitas. gvSIG 2 aún esta en fase beta, faltan herramientas, si sabes trabajar en gvSIG 1.1.2 yo de ti lo haría.
Otra opción sería, si realmente estás interesada en crear una aplicación web con Leaflet, podrías realizar todos los cálculos necesarios y preparar un shape en gvsig. Una vez todo preparado, para publicarlo, cargarlo en QGIS como explican en el siguiente enlace, y de ahí crear el visor con ese plugin (que es el que inspiró mi post) el Leaflet.
http://mappinggis.com/2014/04/qgis2leaf-exporta-un-proyecto-qgis-un-mapa-web-leaflet/
Lo veo una forma factible de hacerlo si lo que te interesa es un visor sencillito que muestre los datos de tus capas (espero en un futuro saber lo suficiente para que esto se pueda hacer tan completo en gvsig).
Gracias por pasarte, espero que sirva de algo mi comentario.