[Gvsig_usuarios] Geocodificar direcciones postal

Mario Carrera mcarrera en gvsig.com
Jue Jul 14 13:22:58 CEST 2016


Hola Óscar,

sí que es posible con gvSIG a través de Scripting.

En este post puedes ver cómo hacerlo:

https://blog.gvsig.org/2015/09/14/convierte-una-tabla-con-direcciones-en-una-capa-de-puntos-con-gvsig-2-x/

Te adjunto de todas formas el script mejorado, donde en lugar de tener
que poner los datos de la nueva capa, tabla origen..., te abre una
ventana donde te los pregunta.

Por otro lado, en este script mejorado, junto al shp te crea un fichero
csv con los registros que no ha reconocido Google, para que puedas
depurarlos.

El problema del límite de registros lo vas a tener igual, ya que utiliza
la API de Google. Creo recordar que estaba en unos 2500 cada 24 horas.

Saludos,
  Mario



El 14/07/16 a las 12:52, Oscar Morales (Sernutec) escribió:
>
> Buenas,
> estoy trabajando en un proyecto en el que tenemos que geoposicionar
> direcciones postales de un municipio.
>
> En otras ocasiones he utilizado webservices de terceros para ello,
> como Google API, pero en este caso no puedo utilizarlo porque el
> volumen de datos a geocodificar es muy grande, además de que no
> cumpliríamos los términos de uso del Google API.
>
> He estado mirando Gisgraphy <http://www.gisgraphy.com/>, pero hay un
> problema con el proceso de importación de datos y no puedo utilizar
> dicho software.
>
> Me preguntaba si gvSIG puede realizar esto.
>
> Muchas gracias.
>
> -- 
> sernutec Firma
>
> *________________________________________*
>
> *Óscar Morales**
> *Departamento de Desarrollo de Sernutec
>
> c/ Mestre Miguel Buendía, 12 bajo
> 46113 Moncada - Valencia
> Tel.: 96 130 91 14
> Fax: 96 130 91 88
> Email: omorales <mailto:omorales en sernutec.com>@sernutec.com
> <mailto:omorales en sernutec.com>
> Web: http://www.sernutec.com <http://www.sernutec.com>
>
>
>
> _______________________________________________
> gvSIG_usuarios mailing list
> gvSIG_usuarios en listserv.gva.es
>
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección:
>
> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios

-- 

*Mario Carrera*

Training, Language and Communication Manager. gvSIG Association

Responsable de Formación, Internacionalización y Difusión. Asociación gvSIG

http://www.gvsig.com <http://www.gvsig.com/>

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listserv.gva.es/pipermail/gvsig_usuarios/attachments/20160714/db597e4c/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: image/gif
Size: 2753 bytes
Desc: no disponible
URL: <http://listserv.gva.es/pipermail/gvsig_usuarios/attachments/20160714/db597e4c/attachment.gif>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: Imagen1
Type: image/jpeg
Size: 27151 bytes
Desc: no disponible
URL: <http://listserv.gva.es/pipermail/gvsig_usuarios/attachments/20160714/db597e4c/attachment.jpe>
------------ próxima parte ------------
from gvsig import *
from geom import *
from commonsdialog import *
import csv
import time

from geopy.geocoders import get_geocoder_for_service

def getGeometryType(type, subtype):
 geometryManager = GeometryLocator.getGeometryManager()
 return geometryManager.getGeometryType(type,subtype)
 
def main(*args):
    """ Agregar a capa de puntos la direccion """
    ### Datos iniciales
   
    fieldAddress = inputbox("Nombre del campo","Introduzca el nombre del campo",initialValue="CALLE") #Campo de la capa tabla
    if fieldAddress in ("",None):
      return
    ruta = filechooser(SAVE_FILE,"Capa a generar")
    if ruta == None or len(ruta)<1:
      return
    ruta = ruta[0]
    # ruta = r"c:\temp\capa_puntos_de_puntos01.shp"
    ### Proceso
    #Copiamos el esquema de la tabla en la capa + geometria
    if currentView()==None:
      msgbox("Abra la vista")
      return
    layer = currentTable()
    if layer == None:
      msgbox("Abra la tabla que quiere geocodificar")
      return
    schema = layer.getSchema()
    newSchema = createSchema(schema)
    newSchema.append("GEOMETRY", "GEOMETRY")
    newSchema.get("GEOMETRY").setGeometryType(getGeometryType(POINT,D2))
    CRS = currentView().getProjection()
    output = createShape(newSchema, ruta, CRS=CRS, geometryType=POINT)
    filecsv = open(ruta.getPath()+".csv","w")
    
    # Locator usado: Google v3
    geolocator = get_geocoder_for_service("googlev3")
    #geolocator = get_geocoder_for_service("nominatim")

    filecsv = open(ruta.getPath()+".csv", "wb")
    fields = layer.getSchema().getAttrNames()
    di = dict()
    for f in fields:
        di[f] = f
    writer = csv.DictWriter(filecsv, fieldnames = fields, delimiter=";")
    writer.writerow(di)
    #Recorremos la tabla
    n = 0
    for feature in layer.features():
        address = feature.get(fieldAddress)
        #..convertimos a location
        location = geolocator().geocode((address))
        values = feature.getValues()
        try:
            #print location.longitude, location.latitude
            #..creamos punto con los valores devueltos por el geolocator
            punto = createPoint(location.longitude, location.latitude)
            values["GEOMETRY"]=punto
            #..creamos la geometria y agregamos a la nueva capa
            output.append(values)
        except:
            print values
            writer.writerow(feature.getValues())
            pass

        n += 1
        if n % 100 == 0:
            print "N. Direcciones Analizadas: ", n
            time.sleep(3)
    filecsv.close()
 
#Agregamos la capa a la Vista y cerramos edicion.
    currentView().addLayer(output)
    output.commit()


Más información sobre la lista de distribución gvSIG_usuarios