gvsig2leaflet: exporta tu capa desde gvSIG a Leaflet en un click

leafgvsigEste 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.

leafgvsig3
Carpeta visor Leaflet

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.

En un click
En un 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.

Ejemplo de uso
Ejemplo de uso

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 &copy; <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

5 respuestas a “gvsig2leaflet: exporta tu capa desde gvSIG a Leaflet en un click

Add yours

  1. 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

    1. 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.

Deja un comentario

Blog de WordPress.com.

Subir ↑