Primera incursión en la simbología desde scripting en gvSIG 2.0

Hola a todos.

El otro día un compañero escribió en la lista de usuarios de gvSIG sobre un proyecto que estaba abordando en gvSIG y precisaba acceder desde scripting a la simbología de una capa.

En principio no se ha preparado nada en el API de scripting para acceder a la parte de simbología… bueno, creo que se añadieron un par de funciones para algo muy, muy, muy básico.

La cuestión es que precisaba exportar la configuración de la simbología que tenía aplicada a una serie de capas y me preguntó cómo podría hacerlo.

Como la respuesta no era “corta” y podría servir para más usuarios de gvSIG he pensado dejarlo caer aquí, en el blog de gvSIG, antes que únicamente en la lista de usuarios.

Bueno, al grano…

Acceder a la configuración de la leyenda de una capa es relativamente simple. basta con:

layer = currentLayer()
legend = layer.getLegend()

Y esto nos devolverá un objeto leyenda de gvSIG.

El problema es que en gvSIG las leyendas son registrables. Es decir, no existe una “Leyenda”, sino que los distintos plugins de gvSIG puede registrar varias leyendas. Esto hace que a priori sea bastante complicado saber a qué operaciones va a responder la leyenda que obtenemos con la invocación al getLegend().

Voy a centrarme con los tipos básicos de leyenda que van con gvSIG 2.0 (en gvSIG 2.1 se incluyen más tipos de leyenda, pero si es necesario ya hablaremos en otro momento de ellos).

Una clasificación podría ser:

  • Leyendas vectoriales (IVectorLegend)
  • Leyendas raster (IRaterLegend)

Pero de momento solo voy a hablar de las leyendas vectoriales.

Otra clasificación podría ser:

Cada tipo de leyenda ofrece una serie operaciones, así que lo primero que deberemos hacer es determinar con qué leyenda estamos trabajando. Para ello dejo aquí unas pequeñitas funcioncitas. Son muy simples, pero lo mejor es que si las necesitamos, y mientras no estén en la librería de scripting, que nos limitemos a pegar el bloque entero en nuestro script.

#==========================================================
#
# Funciones para manejo de los tipos basicos de leyendas
#
from org.gvsig.fmap.mapcontext.rendering.legend import ISingleSymbolLegend
from org.gvsig.fmap.mapcontext.rendering.legend import IClassifiedLegend
from org.gvsig.fmap.mapcontext.rendering.legend import IVectorialIntervalLegend
from org.gvsig.fmap.mapcontext.rendering.legend import IVectorialUniqueValueLegend
from org.gvsig.fmap.mapcontext.rendering.legend import IClassifiedVectorLegend

def getLegendName(legend):
  return legend.getClass().getSimpleName()

def isSingleSymbolLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/ISingleSymbolLegend.html
  return isinstance(legend,ISingleSymbolLegend)

def isVectorialIntervalLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/IVectorialIntervalLegend.html
  return isinstance(legend,IVectorialIntervalLegend)

def isVectorialUniqueValueLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/IVectorialUniqueValueLegend.html
  return isinstance(legend,IVectorialUniqueValueLegend)

def isClassifiedLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/IClassifiedLegend.html
  return isinstance(legend,IClassifiedLegend)

def isClassifiedVectorLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/IClassifiedVectorLegend.html
  return isinstance(legend,IClassifiedVectorLegend)

No hace falta que se entienda mucho el código, nos bastará con saber que una vez incluido en nuestro script podremos saber si nuestra leyenda es de un tipo dado con algo como:

layer = currentLayer()
legend = layer.getLegend()
if isVectorialUniqueValueLegend(legend):
  print "La capa tiene una leyenda de valores unicos"

A falta de API y documentación en scripting para los tipos de leyenda, podemos ir a IVectorialUniqueValueLegend para consultar las operaciones o métodos que podemos usar. Bueno, con esta información accedemos al objeto leyenda de nuestra capa… pero… ¿y ahora qué?

En general, una leyenda contiene una definición de símbolos y una forma de consultar cómo obtener un símbolo dado para aplicarlo a una feature o linea de la tabla de datos asociada a la capa.

Por ejemplo, la leyenda de símbolo único (ISimgleSimbolLegend) tiene un método getDefaultSymbol() que nos devolverá el símbolo a aplicar a todas las features de nuestra capa, mientras que una leyenda vectorial clasificada tendrá un método getSymbols() que nos devolverá la lista de símbolos de esa leyenda. El problema con el que nos vamos a encontrar inmediatamente es que hay muchos tipos de símbolos, al igual que pasaba con las leyendas, y cada cual con sus operaciones o métodos. Así podemos encontrarnos:

A pesar de que hay distintos tipos de símbolos, todos responden a una serie de operaciones muy básicas como:

  • getDescription()
  • getColor()
  • getSymbolForSelection(), con este tened mucho cuidado que es muy fácil quedarse buclado.

Para el resto de operaciones, tendremos que averiguar de qué tipo de símbolo se trata, y al igual que he hecho con las leyendas, tendremos una serie de funciones para preguntar cuál es el tipo de símbolo que tenemos.

#==========================================================
#
# Funciones para manejo de los tipos básicos de símbolos
#
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill import ISimpleFillSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill import IMarkerFillSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill import IPictureFillSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line import ILineSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line import IPictureLineSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker import IMarkerSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker import IPictureMarkerSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker import ISimpleMarkerSymbol
from org.gvsig.fmap.mapcontext.rendering.symbols import ITextSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text import ISimpleTextSymbol

def getSymbolName(symbol):
  return symbol.getClass().getSimpleName()

def isFillSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/fill/IFillSymbol.html
  return isinstance(symbol,ISimpleFillSymbol)

def isMarkerFillSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/fill/IMarkerFillSymbol.html
  return isinstance(symbol,IMarkerFillSymbol)

def isPictureFillSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/fill/IPictureFillSymbol.html
  return isinstance(symbol,IPictureFillSymbol)

def isLineSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/line/ILineSymbol.html
  return isinstance(symbol,ILineSymbol)

def isPictureLineSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/line/IPictureLineSymbol.html
  return isinstance(symbol,IPictureLineSymbol)

def isMarkerSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/marker/IMarkerSymbol.html
  return isinstance(symbol,IMarkerSymbol)

def isPictureMarkerSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/marker/IPictureMarkerSymbol.html
  return isinstance(symbol,IPictureMarkerSymbol)

def isSimpleMarkerSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/marker/ISimpleMarkerSymbol.html
  return isinstance(symbol,ISimpleMarkerSymbol)

def isTextSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/symbols/ITextSymbol.html
  return isinstance(symbol,ITextSymbol)

def isSimpleTextSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/text/ISimpleTextSymbol.html
  return isinstance(symbol,ISimpleTextSymbol)

Entonces podremos hacer cosas como:

layer = currentLayer()
legend = layer.getLegend()
if isSingleSymbolLegend(legend):
  symbol = getDefaultSymbol()
  if isFillSymbol(symbol):
    print symbol.getFillColor()

Con esto mas o menos ya podemos empezar a investigar sobre qué nos ofrece una leyenda, pero una de las preguntas que nos haremos llegados hasta aquí es ¿Y cómo sé qué símbolo se aplica a cada geometría?

La pregunta tiene una respuesta fácil y otra compleja. Nos vamos a quedar con la fácil. A la leyenda podemos preguntarle qué símbolo aplica dada una feature, getSymbolByFeature(). Por ejemplo, podríamos hacer algo como:

layer = currentLayer()
legend = layer.getLegend()
print 
print "Símbolos de cada feature:"
for feature in layer.features():
  # La siguiente linea, es un hack para acceder al objeto feature de java
  # en gvSIG 2.1 probablemente no hará falta.
  feature = feature() 

  symbol = legend.getSymbolByFeature(feature)
  ...

Aquí lo que hacemos es recorrernos las features de la capa, y para cada feature, le preguntamos a la leyenda cuál seria el símbolo que aplica a esa feature.

Bueno, no me voy a extender más, esto es solo el punto de partida para que a quien le interese pueda empezar a hacer pruebas, y si tiene dudas, puede preguntar por la lista de usuarios de gvSIG.

Dejo aquí un script “completo”, jejeje, donde esta todo esto junto. El script coge la capa activa e intenta hacer un volcado por la consola de los datos de la simbología de la capa.

Lo de “completo”, es por que no he sido exhaustivo en la verificación de los tipos de leyenda y símbolos, pero creo que es suficiente lo que hay para ir empezando.

Hasta la próxima.

from gvsig import *

def main():
  #
  # Para hacer las pruebas he cargado en una vista la capa:
  # http://downloads.gvsig.org/download/geodata/vector/SHP2D/provincias_andalucia.zip
  # La he puesto activa y le añadido una leyenda de valores únicos.
  #
  # El código pretende ser un punto de partida, y no está acabado.
  # No solo por que falten leyendas por tener en cuenta, si no porque
  # en muchos puntos he dejado un "#TODO" indicando que por ahí tenéis
  # que continuar vosotros. Sin embargo, creo que es un buen punto de partida
  # para alguien que quiera empezar a ver de manipular leyendas desde scripting.
  #
  # En las funciones isXXXX que hay más abajo he dejado la url a los javadocs de
  # la clase/interface correspondiente. En ellos podéis ver los métodos que tiene
  # cada clase.
  #
  layer = currentLayer()
  print layer.getName()
  #
  # La función dumpLegend está más abajo en este script.
  dumpLegend(layer.getLegend())

  # Bueno, con el código de arriba, podemos ver como acceder a la información de la 
  # leyenda, pero si queremos saber que símbolo se corresponde con que elemento de la capa
  # podemos hacer algo como:

  legend = layer.getLegend()
  print 
  print "Simbolos de cada feature:"
  for feature in layer.features():
    # La siguiente línea, es un hack para acceder al objeto feature de java
    # en gvSIG 2.1 probablemente no hará falta.
    feature = feature() 

    print feature.get(0), "(", feature.toString() ,")"
    dumpSymbol( legend.getSymbolByFeature(feature) )

#==========================================================
#
# Y aquí estaría el código para hacer un volcado en texto de la 
# leyenda y los símbolos. No es exhaustivo y seguramente se puede
# mejorar pero valdrá para ver por donde se puede consultar los
# valores de la leyenda y los símbolos.
#
def dumpLegend(legend):
  print getLegendName(legend)

  if isSingleSymbolLegend(legend) :
    # Esta leyenda tiene un único símbolo que se aplica a todas
    # las geometrias.
    dumpSymbol(legend.getDefaultSymbol())
    return 

  if isClassifiedVectorLegend(legend):
    print "- Campos de clasificacion: ", legend.getClassifyingFieldNames()

  if isClassifiedLegend(legend):
    # Si es una leyenda clasificada tendrá una lista de símbolos
    print "- Símbolos:"
    for symbol in legend.getSymbols():
      dumpSymbol(symbol)
      print 
    print "- Descripciones:", legend.getDescriptions()
    print "- Valores:", legend.getValues()

  # Ahora comprobamos si se trata de otros tipos de leyenda, que pueden
  # ser o no clasificadas.
  if isVectorialIntervalLegend(legend) :
    # TODO
    print "Falta por codificar la leyenda (",getLegendName(legend),")"

  elif isVectorialUniqueValueLegend(legend) :
    # Es una leyenda clasificada (ClassifiedLegend) con algunos
    # valores más. 
    print "- colorScheme: ", legend.getColorScheme()

  else:
    print "No se qué hacer con esta leyenda"

def dumpSymbol(symbol, indentacion=1, selection=False):
  spaces=("  "*indentacion)
  print spaces,"- name: ", getSymbolName(symbol)
  #
  # Atributos que podemos encontrar en todos los símbolos
  print spaces,"- description: ", symbol.getDescription()
  print spaces,"- color: ", symbol.getColor()
  print spaces,"- symbolForSelection: ", symbol.getSymbolForSelection()
  if not symbol.getSymbolForSelection() is None and not selection: 
    # Llamamos a dumpSymbol poniendo selección a true para evitar que se 
    # quede bucleado.

    # Lo comento de momento para evitar una salida tan larga en las pruebas
    #dumpSymbol(symbol.getSymbolForSelection(),indentacion+1, selection=True)
    pass
  #
  # El resto de atributos dependen del tipo de símbolo
  # Cuidado, no hay "else"s ya que pueden haber símbolos que
  # sean de varios tipos a la vez.
  #
  if isFillSymbol(symbol):
    print spaces,"- hasFill: ", symbol.hasFill()
    print spaces,"- hasOutline: ", symbol.hasOutline()
    print spaces,"- fillAlpha: ", symbol.getFillAlpha()
    print spaces,"- fillColor: ", symbol.getFillColor()
    print spaces,"- outline: ", symbol.getOutline()
    if not symbol.getOutline() is None : 
      # Lo comento de momento para evitar una salida tan larga en las pruebas
      #dumpSymbol(symbol.getOutline(),indentacion+1, selection)
      pass

  if isMarkerFillSymbol(symbol):
    # TODO
    print spaces, "Falta por codificar el volcado del simbolo (", getSymbolName(symbol),")"

  if isPictureFillSymbol(symbol):
    # TODO
    print spaces, "Falta por codificar el volcado del simbolo (", getSymbolName(symbol),")"

  if isLineSymbol(symbol):
    # TODO
    print spaces, "Falta por codificar el volcado del simbolo (", getSymbolName(symbol),")"

  if isPictureLineSymbol(symbol):
    # TODO
    print spaces, "Falta por codificar el volcado del simbolo (", getSymbolName(symbol),")"

  if isMarkerSymbol(symbol):
    # TODO
    print spaces, "Falta por codificar el volcado del simbolo (", getSymbolName(symbol),")"

  if isPictureMarkerSymbol(symbol):
    # TODO
    print spaces, "Falta por codificar el volcado del simbolo (", getSymbolName(symbol),")"

  if isSimpleMarkerSymbol(symbol):
    # TODO
    print spaces, "Falta por codificar el volcado del simbolo (", getSymbolName(symbol),")"

  if isTextSymbol(symbol):
    # TODO
    print spaces, "Falta por codificar el volcado del simbolo (", getSymbolName(symbol),")"

  if isSimpleTextSymbol(symbol):
    # TODO
    print spaces, "Falta por codificar el volcado del simbolo (", getSymbolName(symbol),")"

#==========================================================
#
# Funciones para manejo de los tipos básicos de leyendas
#
from org.gvsig.fmap.mapcontext.rendering.legend import ISingleSymbolLegend
from org.gvsig.fmap.mapcontext.rendering.legend import IClassifiedLegend
from org.gvsig.fmap.mapcontext.rendering.legend import IVectorialIntervalLegend
from org.gvsig.fmap.mapcontext.rendering.legend import IVectorialUniqueValueLegend
from org.gvsig.fmap.mapcontext.rendering.legend import IClassifiedVectorLegend

def getLegendName(legend):
  return legend.getClass().getSimpleName()

def isSingleSymbolLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/ISingleSymbolLegend.html
  return isinstance(legend,ISingleSymbolLegend)

def isVectorialIntervalLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/IVectorialIntervalLegend.html
  return isinstance(legend,IVectorialIntervalLegend)

def isVectorialUniqueValueLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/IVectorialUniqueValueLegend.html
  return isinstance(legend,IVectorialUniqueValueLegend)

def isClassifiedLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/IClassifiedLegend.html
  return isinstance(legend,IClassifiedLegend)

def isClassifiedVectorLegend(legend):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/legend/IClassifiedVectorLegend.html
  return isinstance(legend,IClassifiedVectorLegend)

#==========================================================
#
# Funciones para manejo de los tipos básicos de símbolos
#
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill import ISimpleFillSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill import IMarkerFillSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill import IPictureFillSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line import ILineSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line import IPictureLineSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker import IMarkerSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker import IPictureMarkerSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker import ISimpleMarkerSymbol
from org.gvsig.fmap.mapcontext.rendering.symbols import ITextSymbol
from org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text import ISimpleTextSymbol

def getSymbolName(symbol):
  return symbol.getClass().getSimpleName()

def isFillSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/fill/IFillSymbol.html
  return isinstance(symbol,ISimpleFillSymbol)

def isMarkerFillSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/fill/IMarkerFillSymbol.html
  return isinstance(symbol,IMarkerFillSymbol)

def isPictureFillSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/fill/IPictureFillSymbol.html
  return isinstance(symbol,IPictureFillSymbol)

def isLineSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/line/ILineSymbol.html
  return isinstance(symbol,ILineSymbol)

def isPictureLineSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/line/IPictureLineSymbol.html
  return isinstance(symbol,IPictureLineSymbol)

def isMarkerSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/marker/IMarkerSymbol.html
  return isinstance(symbol,IMarkerSymbol)

def isPictureMarkerSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/marker/IPictureMarkerSymbol.html
  return isinstance(symbol,IPictureMarkerSymbol)

def isSimpleMarkerSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/marker/ISimpleMarkerSymbol.html
  return isinstance(symbol,ISimpleMarkerSymbol)

def isTextSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.fmap.mapcontext.api/2.0.18/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.mapcontext/org.gvsig.fmap.mapcontext.api/apidocs/org/gvsig/fmap/mapcontext/rendering/symbols/ITextSymbol.html
  return isinstance(symbol,ITextSymbol)

def isSimpleTextSymbol(symbol):
  # https://devel.gvsig.org/sites/org.gvsig.symbology.lib.api/2.0.18/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.api/apidocs/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/text/ISimpleTextSymbol.html
  return isinstance(symbol,ISimpleTextSymbol)
Posted in gvSIG Desktop, scripting, spanish | 1 Comment

Las 6as Jornadas de Latinoamérica y Caribe se unen a las Jornadas MundoGEO#Connect

Aún con la resaca de las 9as Jornadas Internacionales de gvSIG y ya hablando otra vez de eventos gvSIG. La ocasión lo merece.

La pasada semana se anunció que dos de los eventos más importantes del ámbito GEO en Latinoamérica y Caribe unen fuerzas, celebrando del 7 al 9 de mayo de 2014, en São Paulo, la que puede convertirse en la cita de referencia para el próximo año.

Sin duda esta colaboración permitirá reforzar ambos eventos y reunir en unos pocos días a un gran número de especialistas de la geomática de los más diversos países de Latinoamérica y Caribe.

Otro paso más para divulgar el modelo de desarrollo defendido por el proyecto y la Asociación gvSIG, enmarcado en un proceso de apropiación y soberanía tecnológica de los pueblos de Latinoamérica presente en la agenda regional, como nuevamente quedó demostrado en la última Cumbre de Jefes de Estado de Mercosur, realizada en Montevideo el pasado 12 de julio.

En este sentido, el artículo 45 de la declaración conjunta expresa lo siguiente:

Apoyaron el desarrollo de software libre, que permitirá potenciar el desarrollo regional de soluciones en materia de Tecnología de la Información y las Comunicaciones (TICs), a fin de lograr una verdadera apropiación, promoción del libre conocimiento y transferencia tecnológica, reduciendo la dependencia de soluciones provistas por trasnacionales del sector o por empresas no dispuestas a respetar las industrias nacientes de la región.

Afirmaron el interés de promover el uso de software libre en los programas nacionales destinados a la inclusión digital.

Ratificaron la necesidad de impulsar y fomentar la concreción de normas a nivel del MERCOSUR para la efectiva implementación de políticas de fomento de uso, desarrollo, implementación, investigación y transferencia tecnológica basados en el modelo de software libre.”

Desde ya convocamos a todos los interesados en geomática libre a las 6as Jornadas de Latinoamérica y Caribe de gvSIG. En breve iremos ampliando información tanto desde la que será la web de las Jornadas LAC de gvSIG como desde la web de MundoGEO#Connect.

Posted in events, spanish | Leave a comment

Acabaron las 9as Jornadas Internacionales de gvSIG…

Del miércoles al viernes pasado tuvieron lugar las 9as Jornadas Internacionales de gvSIG, jornadas que no podemos más que calificarlas de un absoluto éxito.

Éxito de asistencia, con sesiones en las que casi era imposible encontrar un asiento libre.

Éxito de ponencias, donde el nivel medio de calidad ha sido altísimo; es un gran motivo de satisfacción, ver como el proyecto gvSIG avanza a la par que sus usuarios.

Éxito en cuanto a la gran amplitud de temas y geografías, con ponencias de varios países, asistentes de casi una veintena y temáticas que iban del sector petrolero a la gestión municipal, pasando por los más diversos sectores de uso de información geográfica.

Éxito de transferencia de conocimiento, con cuatro excelentes talleres sobre scripting, geomarketing, catastro y medio ambiente.

Y éxito, principalmente, por el ambiente de colaboración que se respiraba, por las ganas de participar en un proyecto de construcción colectiva como es gvSIG.

Desde la Asociación gvSIG no podemos más que agradecer a todos los que hacéis posible este tipo de jornadas: patrocinadores, colaboradores, medios asociados, ponentes, asistentes, profesores de talleres, equipo de organización. Jornadas que son la mejor muestra de la fortaleza del proyecto gvSIG.

Y como una imagen vale más que mil palabras, os dejamos con una muestra representativa de las Jornadas:

IMG_0201

IMG_0049IMG_0173IMG_0378IMG_0345IMG_0299IMG_0258IMG_0291

Posted in events, spanish | 3 Comments

Actualización talleres 9as Jornadas gvSIG

Se han puesto a disposición nuevos recursos necesarios para la realización de algunos de los talleres que se impartirán en las 9as Jornadas gvSIG.

Taller de geomarketing (miércoles 27, 15:30h)

Estos son los tutoriales que se usarán en el taller:

También os informamos que para la realización del taller es necesario tener instalado el plugin de análisis de redes (graph), el cual se puede instalar desde el administrador de complementos de gvSIG, conectando con el siguiente repositorio según la versión de gvSIG (instalación desde URL):

Se recomienda traerlo previamente instalado.

Taller de scripting (jueves 28, 15:30h)

Ya están disponibles los scripts que se utilizarán en el taller:

Taller de cartografía catastral (viernes 29, 9:30h)

Tutoriales que se usarán en el taller:

  1. Consulta de datos catastrales.
  2. Descarga de cartografía catastral en formato SHP.
  3. Descarga de cartografía catastral en formato DXF.
  4. Visualización de datos catastrales.
  5. Callejero.
  6. Mapa de cultivo.
  7. Cartografía Alhama.
Posted in events, gvSIG Desktop, opinion, spanish | Leave a comment

Coming soon: Additional options when exporting to KML

La opción de exportar una capa a KML permitirá las siguientes opciones:

  • Globos con los atributos. El archivo resultante mostrará en un globo una tabla con los atributos del elemento (generalmente cuando el usuario pinche sobre el elemento)
  • Etiquetas. Si la capa tiene activado el etiquetado, se mostrarán las etiquetas sobre el elemento (sin que el usuario tenga que pinchar)
  • Forzar reproyección a EPSG:4326. Aunque la vista no esté en este sistema de coordenadas, el KML resultante se reproyectará para ser visualizado correctamente en Google Earth/Maps.

Este breve vídeo muestra las opciones y un par de archivos de salida:

The export-to-KML option will provide the following options:

  • Balloons with attribute values. The resulting file will show attribute values inside a balloon (usually when the user clicks on each feature.)
  • Labels. If labels are enabled in the source vector layer, then they will be shown as floating texts using the default format in KML files.
  • Conversion to EPSG:4326. Even if the view is not in EPSG:4326, this option will create a KML file in EPSG:4326 (standard CRS for KML files, so it will be correctly visualized in Google Earth/Maps).

This short video shows these options and a couple output files:

Posted in development, english, gvSIG Desktop, gvSIG development, spanish | Tagged , , | 1 Comment

9as Jornadas gvSIG: taller de geomarketing.

El próximo jueves 28 miércoles 27 de noviembre y con motivo de las 9as Jornadas Internacionales de gvSIG se impartirá un taller de geomarketing.

Como muchos de vosotros sabréis, el geomarketing consiste en aplicar las herramientas de análisis de los Sistemas de Información Geográfica en el campo de las estrategias comerciales. Algunos de los casos de uso que resuelve el geomarketing son:

  • Ubicación óptima de un determinado tipo de comercio o servicio.
  • Análisis de viabilidad de un determinado tipo de comercio o servicio en una determinada ubicación.
  • Detección de zonas desabastecidas por una determinada red de comercios o servicios.
  • Cálculo de rutas óptimas para visitas comerciales.
  • Cálculo de áreas de servicio en base a distancias o tiempos de recorrido.

En el taller se mostrarán algunos de los geoprocesos de gvSIG que se utilizan habitualmente en esta disciplina para resolver los casos de uso mencionados. En concreto se abordarán los siguientes casos prácticos:

  1. Identificación de zonas mal abastecidas por la actual red de oficinas de correos.
  2. Identificación de la localización óptima para la implantación de una frutería.

Requisitos:

  • Software: Los ejercicios se podrán realizar indistintamente con gvSIG 1.11 o con gvSIG 1.12
  • Cartografía: Los datos necesarios para seguir los ejercicios que se plantearán en el taller se pueden descargar desde el siguiente enlace.

El taller tendrá lugar el jueves 28 miércoles 27 de noviembre a las 15:30h en el Centro Cultural y Deportivo La Pechina de Valencia, España. La inscripción es gratuita (aforo limitado).

Posted in events, gvSIG Desktop, opinion, spanish | 10 Comments

Basuras y TIC

Basuras: Desde hace unos días y en la ciudad de Madrid, los profesionales encargados de las tareas de recogida de residuos y de jardinería están en Huelga. Éste es un servicio que la ciudad de Madrid privatizó hará unos 15 años aproximadamente, bajo el principio, por todos conocidos, de que los servicios privatizados funcionan mejor que los públicos. Como no, si no paran de repetir el mismo mantra. ¿Qué hace la administración? Publicar una licitación para que las empresas concursen. ¿Y que pasó? Pues como hay que ser competitivos, sobre un presupuesto de licitación, imagino que ya ajustado, las empresas que ganaron el contrato hicieron un 33% de rebaja y claro, ahora los números no salen y manejan la eficiente propuesta de despedir a más de de mil trabajadores o sólo a 600 y que los demás se bajen el sueldo, aumenten las horas de trabajo, disminuyan sus derechos, etc. ¿Y la responsabilidad de la administración?

TIC:  Hará pocos meses, me contaron que en una reunión en una administración pública dónde hablaban del futuro TIC,  detectaron lo que parecía la nueva orientación en el sector y su explicación. Ésta consistía en determinar que esto de las TIC se mueve a gran rapidez, cáspita que descubrimiento, y que es evidente que lo que no resulta rentable en términos económicos es mantener una linea formativa entre los empleados públicos que garantice que no queden descolgados de la evolución del sector TIC, sino que lo eficiente era externalizar, eufemismo de privatizar, las necesidades TIC, porque como todo el mundo sabe, el mercado ya se encargará de proveer soluciones punteras en el plano tecnológico. ¿Qué sobre los presupuestos de licitación ya ajustados las empresas deberán hacer grandes bajas, tipo subasta? Eso desde el punto de visto de cierto modelo de administración es bueno, el mercado es sabio y la administración no ha de entrar a valorar si con esos precios hora que resulten es posible o no contratar a personal cualificado que nos permita seguir la línea de evolución en el sector TIC. Y si sucede eso. ¿La responsabilidad de la administración?

Mezcla: En ambos casos tenemos a colectivos profesionales abocados a suertes similares. Estoy seguro que muchos estaréis pensando en escenarios similares en diferentes ámbitos de profesionales , al menos en España, que es la realidad que más conozco. ¿La responsabilidad de la administración?

Posted in opinion | 1 Comment

9as Jornadas gvSIG: taller de Cartografía catastral con gvSIG

[English translation with Google Translator]

Durante las 9as Jornadas gvSIG se impartirá un taller de cartografía catastral con gvSIG a cargo de los profesores de la Universidad Miguel Hernández, Cesáreo Bas y José Antonio Ayén.

El taller tiene como objetivo dar a conocer el catastro, tanto en su estructura interna de datos como aquellos usos derivados que podemos obtener de estos. Este inventario de datos del territorio puede considerarse sin ningún tipo de dudas el más completo del estado español y se puede aplicar por los técnicos a nivel individual en diferentes ámbitos:

  • Redacción de estudios de Impacto Ambiental y Territorial.
  • Todos los procesos relacionados con los regadíos tales como proyectos de modernización o gestión de comunidades de regantes.
  • Redacción de Planes Generales de Ordenación Municipal.
  • Control y valoración de daños en seguros agrarios.
  • Procesos de control de propiedades y producciones en cooperativas agrarias.
  • Creación de cualquier tipo de inventarios asociados al territorio.
  • Gestión municipal de tributos. Control de construcciones ilegales principalmente en el suelo rústico.
  • Todo tipo de proyectos e informes de particulares.
  • Valoraciones de inmuebles
  •  …y un largo etc.

En el taller se realizarán consultas libres de datos de la Sede Electrónica del Catastro y se descargará cartografía catastral en formato SHP. Asimismo, con gvSIG se realizarán ejercicios de:

  • Visualización de datos
  • Elaboración de callejeros
  • Elaboración de mapas de cultivos

Requisitos:

  • Software: Los ejercicios se podrán realizar indistintamente con gvSIG 1.11 o con gvSIG 1.12.
  • Cartografía: Los datos necesarios para seguir los ejercicios que se plantearán en el taller se puede descargar desde el siguiente enlace.

El taller tendrá lugar el viernes 29 de noviembre a las 9:30h. No obstante se recomienda consultar el programa por si hay cambios de última hora. La inscripción es gratuita (aforo limitado).

Los contenidos del taller están basados en el temario del Máster Oficial en Valoración, Catastro y Sistemas de Información Territorial que imparte la Universidad Miguel Hernández de Elche en modalidad online.

Os esperamos.

Posted in english, events, gvSIG Desktop, spanish, training | 2 Comments

9as Jornadas Internacionales gvSIG: Taller sobre gvSIG aplicado al Medio Ambiente

[English translation with Google Translator]

En las próximas 9as Jornadas Internacionales de gvSIG (Valencia – España, 27-29 Noviembre 2013) se realizará un taller sobre gvSIG aplicado a Medio Ambiente (ver programa de las jornadas), impartido por miembros de la empresa eGeoMapping. Este taller dispondrá de traducción simultánea Español-Inglés.

Como ya se sabe los Sistemas de Información Geográfica (SIG) son herramientas que permiten almacenar y procesar datos de forma rápida para poder realizar consultas y representarlos. Actualmente este sistema se encuentra en auge dentro de las disciplinas de gestión del territorio, teniendo cabida dentro de los estudios ambientales como las Evaluaciones de Impacto Ambiental, análisis de alternativas en la toma de decisiones ambientales, estudios catastrales o, simplemente, consulta de información de temática medio ambiental.

Con este taller se pretende dar a conocer los conceptos básicos por los que se rige el funcionamiento de los SIG y aprender a manejar los diversos tipos de archivos cartográficos y temáticos, así como analizar la información para poder elaborar mapas temáticos de diversas materias medio ambientales.

Objetivos del taller

Con orientación específica a la aplicación en el ámbito de Medio Ambiente, los objetivos son:

  • Conocer los aspectos fundamentales del proyecto gvSIG

  • Conocer las funcionalidades básicas de gvSIG Desktop 2.0.

  • Trabajar con Sistemas de Referencia Coordenados

  • Conocer las herramientas de tratamiento de la información

  • Conocer el manejo de vistas y simbología de los datos

  • Realizar mapas temáticos y salidas gráficas

  • Conocer las herramientas de consulta y selección

  • Exportar la información geográfica a diferentes formatos

  • Trabajar con bases de datos e información alfanumérica

  • Aprender las funciones básicas de geoprocesamiento de gvSIG Desktop

  • Trabajar con datos ráster de forma básica

Qué se necesita

Para realizar este taller, lo primero que debes hacer es inscribirte a las jornadas. Puedes hacerlo desde el formulario de inscripción habilitado en la propia web del evento.

Después solo necesitarás acudir con tu portátil. En él deberás llevar instalada la versión gvSIG 2.0.

También tendrás que llevar en el portátil la cartografía necesaria para realizar los ejercicios del taller.

Ejercicios prácticos

Ejercicio 1

¿Qué son las ZEPAS y por qué es interesante cruzarlas con los Parques Naturales?

1.1 Empleando la cartografía de ZEPA.shp y Parques Naturales.shp, se obtendrán aquellos lugares que presentan una categoría de protección común.

1.2. Incluir las carreteras de la zona e identificar si pasan por algún Parque Natural o por alguna ZEPA.

Ejercicio 2

2.1. Empleando la cartografía Series de Vegetación.shp y la tabla Vegetación.dbf se obtendrá una nueva cartografía de Series de Vegetación donde se indique específicamente en cada registro de la tabla de atributos la categoría de la Serie de Vegetación que le pertenece.

Ejercicio 3

3.1. Mediante la cartografía de Suelos.shp y Vulnerabilidad.shp de los suelos de Aragón se obtendrán las zonas que cumplan los siguientes criterios:

-Aquellas zonas con vulnerabilidad muy alta cuyo tipo de suelo esté tipificado como Fluvisol calcáreo.

-Aquellas zonas con vulnerabilidad media con tipo de suelo tipificado como Xerosol cálcico.

-Todas aquellas zonas con vulnerabilidad baja cuyo tipo de suelo esté considerado dentro del grupo de los Regosoles.

Ejercicio 4

4.1. Determinar la viabilidad y determinación de la zona por la que tendría que pasar una carretera sin incidir en ningún paraje con algún tipo de protección medio ambiental.

¡Te esperamos!

Posted in english, events, gvSIG Desktop, spanish | 4 Comments

9as Jornadas de gvSIG: Taller de Scripting con Python

En las próximas 9as Jornadas Internacionales de gvSIG vamos a realizar un taller sobre el módulo de Scripting en gvSIG 2.0. El objetivo es aprender a manejar este módulo de programación y poder realizar nuestros primeros scripts en Python, verás de lo que es capaz esta pequeña pero potente herramienta. Orientado a gente sin conocimientos de programación, no tengas miedo si no sabes programar, ven al taller y te enseñaremos paso a paso como hacerlo funcionar y poder sacarle provecho.

Si aún no estás inscrito en las jornadas no esperes más!

¿Qué vamos a ver?

Empezaremos desde cero, desde como funciona el entorno y crear tu primer script, hasta algunos algunos ejemplos más elaborados, para que puedas ver de lo que es capaz.

También llevo mi blog personal Masquesig sobre Scripting en gvSIG, donde podrás ver ejemplos parecidos a los que haremos. Si tienes alguna preferencia o estás interesado en alguno en especial, hacerlo saber en los comentarios y lo preparemos mejor.

Queremos animaros a que propongáis scripts que os podrían ser útiles e intentaremos tenerlos listos para explicarlos paso a paso durante el taller! Estaremos atentos a vuestros comentarios.

¿Qué necesitas?

Con que traigas tu ordenador con la versión de gvSIG 2.0 instalada (las anteriores no permiten instalar esta extensión) y el módulo de Scripting instalado desde el Administrador de complementos será suficiente. Abajo incluyo una guía detallada para los que andáis algo más perdidos para instalar el módulo.

También será necesario descargar los scripts que se van a mostrar. Abajo incluyo un enlace de los datos, también utilizados en los vídeos de edugvsig, en los que intentaré basar todo el taller.

Todo esto es para facilitaros poder seguir el taller en vuestro propio ordenador y que no tengáis problemas.

Enlaces que os pueden interesar:

No olvides poner tus ideas de scripts en los comentarios y cualquier duda no dudéis en preguntar! Allí nos vemos, ¡espero vuestra asistencia!

Posted in development, events, gvSIG Desktop, opinion, scripting, spanish | 4 Comments