Apareció hace poco en la lista de correo de gvSIG un mensaje escrito por Joaquin (desarrollador de gvSIG) sobre «Centrar vista en un polígono» y también una compañera Laia Linares publicó en su blog una adaptación del código para «Buscar una referencia catastral» y hacerle zoom.
Así que decidí hacer mi propia versión, parecida al post de mi compañera, el código es muy sencillo y le puede ser útil a mucha gente. Lo que acabaremos haciendo es un script que centre la vista a un polígono o polígonos que buscaremos con un parámetro capturado con un inputbox que nos lo preguntará y lo buscará en la capa activa, y lo tratará diferente según encuentre una o varias entidades, centrando la vista a la entidad o a la extensión de las entidades, teniendo la posibilidad de ir recorriendo todas las entidades encontradas centrándolas en vista de una en una. Pero antes un poco de explicación.
El comando que nos permite todo esto, centrar la vista a la entidad, es muy sencillo y es:
view.getMap().getViewPort().setEnvelope(<Envelope>)
Así que para hacer zoom a una entidad, solo necesitamos acceder a su geometría, y utilizar el comando «geom.getEnvelope()«, que accederá a la extensión de la geometría, y pasarlo por el comando anterior en el lugar de <Envelope>. Y con esto llegamos al código muy sencillo que nos muestra Joaquin en el post que nombre al principio:
from gvsig import * def centrarVista(view, geom): view.getMap().getViewPort().setEnvelope(geom.getEnvelope()) def main(): layer = currentLayer() view = currentView() # Buscamos la geometria de la provincia de granada set = layer.features('PROVINCIA = GRANADA') #Accedes al primer item de esa lista first = iter(set).next() # Ahora centramos la vista en esa geometria centrarVista(view, first.GEOMETRY)
Con este código lo que hace es buscar en la capa las entidades que cumplen la condición de «PROVINCIA = GRANADA» y la que cumpla la condición le hará zoom.
Y eso es lo que querido mejorar para que se pueda adaptar a vuestras necesidades. El siguiente script lo que hará es centrar la vista en la entidad o entidades que busquemos.
En el código solamente deberéis de cambiar la variable expresion por la columna donde queréis buscar (podría ser una ref. catastral, la ID, nombre..) y el script os preguntará mediante una inputbox que valor queréis. Después de esto hará un zoom a la entidad que encuentre, si hay más de una entidad con ese valor, hará un zoom a la extensión de todas la que lo tengan. He añadido una linea extra que hará que estas entidades también queden seleccionadas, si no queréis esta función tan solo tenéis que eliminarlas del script.
Si dejáis el código de selección, y ejecutáis varias veces, irá añadiendo selecciones a la capa con vuestra búsqueda, a lo mejor os puede servir también como script inicial para seleccionar entidades y luego lanzar otro script.
El resultado del script será como el de la primera imagen que abre el post si fuera una sola entidad, o como la siguiente imagen para varias entidades.
from gvsig import * from commonsdialog import * from geom import * def main(): centrar() def centrar(): #Centra una selección / zoomFiltro.py #@masquesig layer = currentLayer() view = currentView() #Que entidades o entidades buscamos expresion = "NOMBRE=" valorID = inputbox(expresion) if valorID == None: return filtro = expresion + "'" + str(valorID) + "'" selection = layer.features(filtro) print filtro try: count = selection.getCount() except: print "Error con la expresion / capa erronea" return #Centrar o zoom #Segun tengamos 1 o varias entidades if count == 1: first = iter(selection).next() geom = first.geometry() centrarVista(view,geom) #Selecciona la entidad encontrada #No es necesaria layer.select(first) elif count &amp;amp;amp;gt; 1: geom = iter(selection).next().geometry() for select in selection: #centrarVista(view,select.geometry()) #msgbox("Continuar") geom = select.geometry().union(geom) #Selecciona la entidad encontrada #No es necesaria layer.select(select) centrarVista(view,geom) else: print "Error: entidad o entidades no encontradas" return def centrarVista(view,geom): view.getMap().getViewPort().setEnvelope(geom.getEnvelope())
Como podéis ver también en las lineas 42 y 43 , hay dos lineas desactivadas (si las quieres activar tan solo elimina los # de delante). Estas lineas lo que hacen es, si hay varias entidades que han cumplido el valor, va recorriendolas haciendo zoom a ellas de una en una, puede ser una función interesante si tenéis que repasar muchas de un vistazo rápido.
Un script extra complementario puede ser el mismo que tenemos en la barra de herramientas de «Encuadre previo» pero lanzado desde el módulo de scripting. Por ejemplo, en el script anterior le encontré uso cuando solo seleccionamos una entidad y hace zoom a ella pero al acabar quieres volver al encuadre anterior, así que podemos introducir un confirmBox preguntando si desea volver al anterior, y según la respuesta ejecutar el comando o no.
currentView().getMap().getViewPort().setPreviousEnvelope()
from gvsig import * def main(): #Encuadre previo / zoomBack.py view = currentView() view.getMap().getViewPort().setPreviousEnvelope()
O con un zoom a la extensión total:
from gvsig import * def main(): # Zoom extension / zoomEnvelope.py view = currentView() envelope = view.getMap().getLayers().getMapContext().getFullEnvelope() view.getMap().getLayers().getMapContext().zoomToEnvelope(envelope)
O también:
from gvsig import * def main(): vista = currentView() layer = currentLayer() vmap = vista.getMap() vmap.zoomToEnvelope(layer.getFullEnvelope())
Hola Oscar, te paso lo que te comenté de los de Ingenieros Sin Fronteras http://esfmozambique.wordpress.com/
Al final parece que para el tema de la parcelación han usado ESRI, pero han realizado un manual básico de mapeo con gvSIG. No se, échale un vistazo si quieres. La charla que nos dieron estuvo interesante.
Hola Edu, veo que aún te acordabas! Gracias por buscarlo, luego le echo un vistazo.