Compumap® Geocoding Manual del Usuario Compumap® Geocoding Índice de Contenidos Tabla de contenido Compumap® ...................................................................................................................... 1 Geocoding.......................................................................................................................... 1 Manual del Usuario ............................................................................................................ 1 Índice de Contenidos ......................................................................................................... 2 Introducción ...................................................................................................................... 5 Sección I – Características geográficas................................................................................ 6 Representación de datos geográficos ............................................................................. 6 Esquinas y Entrecalles .................................................................................................... 8 Excepciones – Direcciones que no pueden nomenclarse .............................................. 10 Domicilios Catastrales .............................................................................................. 11 Barrios Privados y Countries ..................................................................................... 11 Otras direcciones no nomenclables .......................................................................... 12 División Política del País ............................................................................................... 12 Ciudad Autónoma de Buenos Aires .......................................................................... 13 Provincia de Buenos Aires ........................................................................................ 13 Resto de las Provincias ............................................................................................. 15 Organización de Mapas ................................................................................................ 16 Ciudad Autónoma de Buenos Aires .......................................................................... 16 Partidos del Gran Buenos Aires ............................................................................... 16 Capitales provinciales ............................................................................................... 16 Partidos y Departamentos del Interior ..................................................................... 16 Comunas rurales ...................................................................................................... 16 Composición de Mapas ............................................................................................ 17 Sección II – Descripción de las tablas y modelo relacional ................................................ 18 2 Compumap® Geocoding Tablas de Geocoding .................................................................................................... 18 CP_CABA .................................................................................................................. 18 Calles........................................................................................................................ 19 Gcodes ..................................................................................................................... 20 Localidad .................................................................................................................. 21 Lugares..................................................................................................................... 23 Mapas ...................................................................................................................... 25 Provincia .................................................................................................................. 25 Segmentos ............................................................................................................... 26 Sinon_Calle .............................................................................................................. 28 Sinon_Locali ............................................................................................................. 29 Sinon_Mapa ............................................................................................................. 30 Sinon_Prov ............................................................................................................... 31 TipoCalle .................................................................................................................. 32 Modelo Relacional ....................................................................................................... 33 Sección III – Funcionalidad y obtención de resultados ...................................................... 34 Introducción ................................................................................................................. 34 Convenciones utilizadas ............................................................................................... 34 Sentencias SQL ......................................................................................................... 34 Pseudocódigo ........................................................................................................... 35 Fuente del pseudocódigo y sentencias SQL .............................................................. 35 Comentarios ............................................................................................................. 35 Variables .................................................................................................................. 35 Listas ........................................................................................................................ 36 Condiciones .............................................................................................................. 36 Caracteres Extendidos .............................................................................................. 37 Ejemplos ...................................................................................................................... 38 Dado el nombre de localidad, devolver su ID de Mapa ............................................. 38 Dado el ID de Mapa, obtener el nombre del mapa ................................................... 39 3 Compumap® Geocoding Dado un código postal, obtener el nombre del mapa ............................................... 39 Obtener datos diversos de una localidad .................................................................. 40 Obtener lista de mapas de una provincia.................................................................. 41 Dado ID de Calle y Mapa obtener Nombre y rango de alturas válido ........................ 41 Obtener el código postal (CABA) dado el ID_calle y la altura .................................... 42 Obtener coordenadas de la cuadra donde está la dirección ..................................... 43 Cruces, Esquinas y Entrecalles ...................................................................................... 45 Obtener cruces de una calle ..................................................................................... 45 Validación de existencia de una esquina................................................................... 48 Dada una dirección obtener las entrecalles .............................................................. 50 Uso de Sinónimos......................................................................................................... 53 Lugares ........................................................................................................................ 56 Incorporar lugares con Compumap® Office .............................................................. 56 Incorporar lugares sin Compumap® Office ............................................................... 63 Soundex – Búsqueda fonética de Nombres .................................................................. 66 Función Soundex ...................................................................................................... 66 Argumentos ............................................................................................................. 66 Devuelve .................................................................................................................. 66 Comentarios ............................................................................................................. 66 Descripción del Código Soundex ............................................................................... 67 Reglas de Codificación .............................................................................................. 68 Algunos ejemplos ..................................................................................................... 69 Función DIFFERENCE() .............................................................................................. 69 Consideraciones adicionales antes de implementar códigos soundex....................... 72 4 Compumap® Geocoding Introducción Compumap® Geocoding consiste de una serie de tablas planas que pueden ser importadas a cualquier base de datos existente en el mercado. Con Geocoding, el usuario puede agregar en sus sistemas toda la funcionalidad que requiera en sus sistemas para consultar, nomenclar, o georreferenciar domicilios sin ningún tipo de limitación. Tanto Compumap® Geocoding como el manual está orientado a personal de sistemas, administradores de bases de datos, o desarrolladores de software. Si bien las tablas provistas son planas, se entregan de este modo para que el usuario pueda importarlas a cualquier base de datos de su preferencia, los ejemplos de uso que se muestran en este manual se refieren a consultas SQL. Este manual está dividido en tres secciones: a) La primera sección está orientada a las características geográficas de un sistema, la correcta representación y normalización de datos, problemas habituales y cómo está organizada la información geográfica de acuerdo a las divisiones políticas del país. b) La segunda sección detalla el modelo canónico-relacional de la base de datos, describe las tablas y su contenido, dando una breve reseña de uso de cada uno de ellos. c) La tercera sección muestra ejemplos de uso de las tablas para obtener diversos resultados, como por ejemplo nomenclar direcciones una a una o en modo batch, obtener punto medio de una cuadra, obtener códigos postales, obtener coordenadas geográficas, y muchas funciones más. 5 Compumap® Geocoding Sección I – Características geográficas Representación de datos geográficos Con mucha frecuencia vemos que los sistemas de gestión de las empresas carecen de normalización y/o datos en su mínima expresión en los domicilios. Esto implica que cuando se decide la adquisición de un producto de nomenclación, como Compumap®, la transición para la limpieza de datos históricos y luego la nomenclación en línea de las direcciones nuevas puede resultar una tarea bastante tediosa y frustrante. Por ejemplo, la siguiente figura muestra una dirección guardada en forma incorrecta: Los errores que encontramos en esta representación son: a) Falta de atomización de datos: La columna Domicilio contiene varios datos como el nombre de la calle, el número de puerta, el piso y departamento. Estos últimos datos no aportan a la georeferenciación del domicilio por lo que pueden ir juntos o separados en otra(s) columna(s). b) Ambigüedad en el nombre de la calle: En la Ciudad Autónoma de Buenos Aires, hay dos calles con el nombre “Mitre”, una es Emilio Mitre y la otra Bartolomé Mitre. Si estuviéramos nomenclando direcciones con Compumap® Office y hemos decidido detenernos en cada error, podríamos seleccionar la calle de una lista que muestra ambas calles, pero esto no garantiza que la selección realizada sea la correcta, salvo que el número no esté dentro del rango de altura de la calle seleccionada. Con Compumap® Geocoding, una de las formas de determinar la calle que corresponde es a través de una búsqueda por código postal en la tabla CP_CABA. En la siguiente figura puede verse que esta dirección corresponde a la calle “MITRE BARTOLOME”, la última columna muestra el ID de calle (ID_Calle) que le corresponde a la calle en la tabla de calles. 6 Compumap® Geocoding Nota: Observe que en el caso de “MITRE EMILIO” las columnas Alt_desde y Alt_hasta muestran el valor 0 (cero). Esto significa que la calle tiene el mismo código postal en toda su longitud. c) Localidad no normalizada: Note que en la columna localidad aparece el texto “CAP. FED.”, pero normalmente no hay garantías de que se ingrese siempre el mismo texto para la misma localidad, salvo que lo haga seleccionándola desde una tabla. Para ello Compumap® Geocoding incluye una serie de tablas de sinónimos. El nombre de mapa para la Capital Federal es “CABA”, por lo tanto para relacionar “CAP. FED.” con CABA hay que definir un sinónimo. En la figura más abajo puede verse el contenido de la tabla Sinon_Mapa conteniendo diversos sinónimos para CABA (Id_Mapa = 0). 7 Compumap® Geocoding La forma correcta de representación para nomenclar sin problemas una dirección debe ser como la de la figura siguiente: Esquinas y Entrecalles En ocasiones, las direcciones pueden representarse por calle y esquina o calle y entrecalles. Calle y esquina indica el cruce de la calle con la esquina, por ejemplo Bartolomé Mitre esquina Esmeralda: Las entrecalles tienen la forma “Calle entre Calle1 y Calle2”. Por ejemplo “Bartomé Mitre entre Esmeralda y Suipacha” indica que la dirección será representada en la calle B. Mitre entre las calles Esmeralda y Suipacha, como se muestra en la siguiente figura: 8 Compumap® Geocoding Las empresas de Servicios (Luz, Gas, Teléfono, etc.) y los correos privados normalmente utilizan las entrecalles para asegurarse el punto preciso de entrega dentro de una cuadra. Cuando se nomenclan direcciones en Compumap® Office, y las entrecalles vienen informadas junto a la altura, el punto es georeferenciado en la mitad de la cuadra que corresponde a las entrecalles debido a que esto puede resolver problemas de alturas en el mapa, o en los casos de localidades que tiene más de una altura como en el Partido de General San Martín, Partido de 3 de Febrero, Partido de Hurlingham, y otros. También resuelve el problema de alturas inexistentes en calles de ciertas localidades del interior. Para tener definidas las entrecalles, se debe agregar dos columnas adicionales a las tablas que contengan domicilios. Por lo tanto, la estructura de una dirección quedará similar a la siguiente figura: DEFINICION POR ESQUINA 9 Compumap® Geocoding DEFINICION POR ENTRECALLES: El orden del nombre de calle en las columnas Calle1 y Calle2 no es importante ya que la validación de que dichas calles se crucen con la calle del domicilio se hará independientemente una de la otra. La forma de trabajar con cruces de una calle se detalla en la Sección III de este manual. Allí usted aprenderá a: a) Obtener nombres o IDs de calles que cruzan a una calle dada. b) Obtener las entrecalles correspondientes a cada lado de una calle y número de puerta. c) Diferenciar un vértice de cruce de calles de un vértice de curvatura. d) Obtener los cruces de uno y otro lado de una esquina. Excepciones – Direcciones que no pueden nomenclarse Las direcciones que se pueden nomenclar con Compumap® Geocoding deben contener un mínimo de datos, como se muestra en la siguiente tabla: MAPA x x x CALLE x x x CALLE1 CALLE2 x x x ALTURA x En todos los casos se necesita conocer la calle y el mapa al que pertenece. Con estos dos datos, se requiere de al menos un dato más para obtener una dirección, es decir la altura, la esquina o las entrecalles. Existen algunos casos donde las direcciones no tienen la forma básica que requiere Compumap® para georeferenciarla. A continuación presentamos algunos ejemplos de 10 Compumap® Geocoding direcciones que pueden resultar difíciles de georeferenciar, y cómo puede resolver estos casos. Domicilios Catastrales Los domicilios catastrales son domicilios del tipo “Circunscripción 1 Sección 2 Manzana 4 Casa 8, Ciudad Evita, La Matanza, Provincia de Buenos Aires”. Estos domicilios se refieren a datos catastrales del municipio y están presentes en algunas localidades y barrios tanto del Gran Buenos Aires como del interior del país. En este caso específico, las calles tienen nombre y las casas números, pero sus habitantes raramente las utilizan. En el caso de obtener una dirección de esta forma lo ideal sería obtener la calle y las entrecalles que corresponden a dicho domicilio. Por otro lado, será útil ingresar el domicilio original como referencia en un campo de texto. En la siguiente imagen puede verse en el mapa cómo se georeferenció la calle Italia entre Zeballos y Chile (O) en Ciudad Evita: Barrios Privados y Countries 11 Compumap® Geocoding Los barrios privados y countries tienen calles privadas por lo que normalmente no son conocidos los nombres de sus calles internas. Además, es común que cada casa tenga un número de lote o casa, en lugar de la habitual numeración correspondiente a la altura de la cuadra. Para realizar entregas en un country o barrio cerrado, habrá que saber llegar a los alrededores del mismo, o en lo posible hasta su entrada. Para resolver esto, Compumap® Geocoding tiene una tabla denominada Lugares, que contiene información de 177 countries y barrios cerrados del Gran Buenos Aires, sus coordenadas geográficas y una dirección real cercana al punto representado por sus coordenadas geográficas. En la Sección III se detalla la forma de agregar lugares en esta tabla y cómo asignarle una dirección ya sea utilizando Compumap® Office o bien, si no cuenta con este producto se indica cómo asignar la dirección más cercana procesando la tabla de segmentos. Otras direcciones no nomenclables Otras direcciones que no pueden nomenclarse son: a) Domicilios del tipo “Ruta Provincial 319 Km. 14 , Marino, Tucumán” b) Domicilios del tipo “Edificio 5 Nudo 3 Departamento 15” c) Domicilios que hacen referencia a lugares sólo conocidos por habitantes locales. Esto suele pasar en comunas rurales del interior del país. d) Domicilios del tipo Calle – Altura en mapas de localidades pequeñas donde no se cuenta con información de alturas. e) Domicilios cuyo nombre de calle no puede ser encontrado en el mapa, ya sea que la calle no está incluida en el mapa o aparezca con la denominación “Calle sin nombre xxx”. División Política del País Cada país tiene una división política que no es más que una organización territorial en diferentes niveles para administrar su territorio nacional. En Argentina la organización territorial está dada en el primer nivel por provincias, aunque también existen regiones que abarcan a varias provincias resultantes de tratados 12 Compumap® Geocoding interprovinciales de integración, sin perder su autonomía como provincia. Excluyendo a la Ciudad Autónoma de Buenos Aires y la provincia de Buenos Aires todas las provincias integran alguna de las siguientes regiones creadas para diversos fines: a) b) c) d) Región del Norte Grande Argentino Región del Nuevo Cuyo Región Patagónica Región Centro Ciudad Autónoma de Buenos Aires La Ciudad de Buenos Aires tiene el mismo status de una provincia, ya que es administrada por un jefe de gobierno y tiene una legislatura. El siguiente nivel es la subdivisión por Barrios con límites bien definidos. En el año 2005 se crearon unidades administrativas denominadas Comunas que abarcan a uno o más barrios, y que son administradas, con algunas atribuciones limitadas, por juntas vecinales de 7 miembros elegidos por el voto popular. Provincia de Buenos Aires La provincia de Buenos Aires es la que tiene mayor cantidad de habitantes del país, tiene cinco veces más que la provincia que le sigue, la provincia de Córdoba. La provincia está dividida en partidos, los más populosos y urbanos son los del Gran Buenos Aires, alrededor de la Ciudad Autónoma de Buenos Aires. Cada Partido tiene su propio Municipio cuya autoridad es el Intendente municipal. Dentro de cada municipio haber varias localidades (con límites bien definidos) y además cada localidad puede tener barrios, aunque muchas veces los límites de estos últimos no están oficializados en el municipio. Las localidades son las divisiones de un partido que tienen un código postal asignado. En el Gran Buenos Aires es difícil determinar dónde comienza y termina una localidad debido a la propia urbanización, pero en los partidos del interior de la provincia es mucho más fácil ya que entre una localidad y otra suele haber extensiones rurales o semi-rurales que separan a los cascos urbanos entre sí. 13 Compumap® Geocoding 14 Compumap® Geocoding Resto de las Provincias En el resto de las provincias, el siguiente nivel de división son los departamentos. Cada departamento puede tener varios municipios dependiendo del tamaño y envergadura de las localidades que incluye. En los pueblos más pequeños puede haber delegaciones municipales de una ciudad cercana más grande, y en otros casos puede haber un jefe comunal, como por ejemplo en las comunas rurales de gran extensión, aunque sus atribuciones son más limitadas que las de un intendente municipal. Al igual que en la provincia de Buenos Aires, el resto de las provincias pueden tener varias localidades dentro de un departamento. Una localidad puede ser una comuna rural, un pueblo o una ciudad. La denominación de la localidad está relacionada con la cantidad de habitantes que posee. Por ejemplo, Rio Cuarto es la ciudad cabecera del departamento homónimo en la provincia de Córdoba. Las Higueras es una ciudad que forma un conglomerado con la ciudad de Rio Cuarto y el gran Rio Cuarto, aunque tanto las Higueras como Rio Cuarto tienen su propio intendente y municipio. Cabe destacar que Las Higueras tiene una población de casi 6000 habitantes. A poco más de 15 kilómetros al NE de Las Higueras hay una localidad denominada Chucul con 236 habitantes y no tiene municipio ni intendente, y tampoco depende de otros municipios. Por tratarse de una comuna rural, tiene un presidente comunal. 15 Compumap® Geocoding Organización de Mapas Cada mapa individual puede representar una extensión geográfica diferente, dependiendo de la región que representa. Ciudad Autónoma de Buenos Aires El mapa de CABA representa a toda la ciudad la cual tiene status de Provincia. Este es el único caso de un mapa que representa a una “provincia” debido a su tamaño reducido (202 Km2). Partidos del Gran Buenos Aires Los partidos que forman el conglomerado del Gran Buenos Aires contienen mapas que representan al partido en toda su extensión. Capitales provinciales Algunas de los mapas de ciudades capitales abarcan todo el departamento Capital de su provincia y en otros casos sólo el casco urbano. En las capitales más grandes, las localidades que forman el conurbano junto a la capital tienen mapas individuales mientras que en otros casos, hay localidades del conurbano de la capital provincial que están incluidas dentro del mapa, como por ejemplo en San Juan Capital donde se incluyen las localidades conurbanas de Rawson y Rivadavia, o en San Luis Capital que incluyen las localidades de La Punta y Juana Kosslay. Partidos y Departamentos del Interior En el resto de los partidos de la provincia de Buenos Aires, como en los departamentos de cada una de las provincias (exceptuando las capitales), los mapas representan el casco urbano de la localidad y en la mayoría de los casos las áreas rurales de las mismas. Comunas rurales Existen algunos mapas disponibles que representan pequeñas comunas rurales donde los habitantes se encuentran muy dispersos. Estos mapas normalmente no están enriquecidos con datos como nombres de las calles o alturas. Por lo general, estos mapas no son volcados a tablas de Geocoding debido a su falta de enriquecimiento. Adicionalmente, Compumap contiene varios mapas base que representan a cada una de las provincias con su división política por partidos o departamentos, y las rutas nacionales y provinciales que pasan por ellas. Estos mapas no se usan para bajar a tablas de 16 Compumap® Geocoding Geocoding, excepto por el nombre e Id de cada provincia que se usa para popular la tabla de provincias. Composición de Mapas Prácticamente en todos los mapas digitales los “objetos” cartográficos son representados por capas. Cada una de las capas representa un tema específico dentro de la cartografía. Hay diversas capas disponibles en Compumap, como por ejemplo Ejes viales, Partido, Hidrografía, Vías férreas, áreas verdes, parques y plazas, etcétera. Para obtener las tablas de Geocoding, sólo se realizan vuelcos de las capas de Ejes viales de cada uno de los mapas involucrados. La capa de Ejes contiene distintos tipo de ejes, como las calles, avenidas, rutas, bulevares, callejones, autopistas, etcétera. Estos ejes están representados por segmentos de una polilínea, es decir la calle completa está representada por una polilínea, pero los segmentos (partes de una polilínea) representan con una línea recta entre dos vértices a las cuadras de dicha calle. Adicionalmente, hay una serie de atributos en cada segmento, que indica la altura inicial y final del segmento, el ID de vértice inicial y final, el sentido de circulación vehicular, la localidad o barrio al que pertenece el segmento, entre otros atributos. No obstante, también se generan algunas tablas para describir algunos de los atributos de los segmentos o para indicar pertenencia de éstos a otras capas, como por ejemplo mapas o localidades. 17 Compumap® Geocoding Sección II – Descripción de las tablas y modelo relacional Tablas de Geocoding La siguiente es una lista detallada de todas las tablas que componen la base de datos GEOCODING: CP_CABA Esta tabla se utiliza para obtener el código postal de un segmento o una calle dentro de la Ciudad Autónoma de Buenos Aires. A diferencia del resto del país, los códigos postales de CABA se asignan por calle en toda su extensión, o por calle entre un rango de alturas. CREATE TABLE CP_CABA ( ID int PRIMARY KEY NOT NULL, Nombre_Calle_Postal varchar(50), Alt_desde int, Alt_hasta int, Codigo_Postal int, Id_Calle_Mapa int, ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. 18 Compumap® Geocoding Tabla: CP_CABA CAMPO TIPO Id Integer Nombre_Calle_Postal Varchar(50) Alt_desde Integer Alt_hasta Integer Codigo_Postal Id_Calle_Mapa Integer Integer KEY PK FK NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Nombre de la calle en la guía de códigos portales. La nomenclación de la calle puede coincidir o no con el nombre de la calle en el mapa. Altura inicial desde la cual se aplica el código postal. Si es cero toda la calle tiene el mismo código postal. Altura final hasta la cual se aplica el código postal. Si es cero toda la calle tiene el mismo código postal. Código postal de 4 dígitos. Id de la calle en el mapa de Compumap. El ID de mapa de CABA es 0 (cero). Calles Esta tabla contiene información de las calles de cada mapa en toda su longitud. Indica el nombre de calle, tipo de calle (autopista, avenida, calle, bulevar, puente, túnel, etc.) y el rango de alturas válidas de la calle. También contiene el ID de mapa al que pertenece la calle. CREATE TABLE Calles ( Id int PRIMARY KEY NOT NULL, Id_Calle int, Id_Mapa int, Nombre_Calle varchar(50), Id_Tipo int, Alt_desde int, Alt_hasta int, ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los 19 Compumap® Geocoding CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Calles CAMPO Id Id_Calle Id_Mapa Nombre_Calle Id_Tipo TIPO Integer Integer Integer Varchar(50) Integer Alt_desde Alt_hasta Integer Integer KEY PK FK FK NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Id de calle dentro del mapa. Id de mapa. FK de la tabla Mapas Nombre de la calle. Indica el ID de tipo de calle (Avenida, ruta, etc.) FK de tabla TipoCalle Altura inicial desde el inicio de la calle. Altura final hasta el fin de la calle. Entre este campo y el anterior puede conocerse el rango de alturas válido, salvo que la calle no tenga informadas las alturas. Gcodes La tabla contiene información de localidades, partidos y/o departamentos, provincia, códigos postales, y coordenadas geográficas de la localidad o código postal. También contiene los mapas disponibles (ID de mapa), es decir que las localidades que tienen un ID >= 0 (cero) tienen mapa disponible, y si el ID = -1 no tiene mapa disponible. Los ID de mapas se corresponden a los mapas disponibles en Compumap, y no los que haya adquirido. El uso de esta tabla es diverso, y puede servir principalmente para georeferenciar por código postal aquellas localidades que no pueden ser nomencladas por domicilio. También permite conocer qué mapas agregar a las tablas de Geocoding debido a los puntos que se han georeferenciado fuera del ámbito geográfico adquirido. CREATE TABLE Gcodes ( Id int PRIMARY KEY NOT NULL, Localidad_Postal varchar(60), Id_Prov int, Id_PdoDto int, PdoDto varchar(60), Id_Mapa int, NombreMapa varchar(60), 20 Compumap® Geocoding Latitud Numeric, Longitud Numeric, ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Gcodes CAMPO Id Localidad_Postal TIPO Integer Varchar(60) KEY PK Id_Prov Id_PdoDto Integer Integer FK PdoDto CPostal Id_Mapa Varchar(60) Integer Integer NombreMapa Varchar(60) Latitud Longitud FK NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Nombre de la localidad en la guía de códigos postales. Id de provincia. FK de la tabla Provincia ID de Partido o Departamento de los mapas base de Compumap. Nombre del partido o departamento. Código Postal de la localidad. ID del mapa. Los mapas existentes en la tabla Mapas se relacionan con éstos, aunque hay mapas que no se verán reflejados en dicha tabla. Los mapas no disponibles tienen ID = -1. Nombre del mapa al que corresponde la localidad. Los nombres existen aunque el mapa no esté disponible. Latitud en formato GG.DDDDDD (*) Longitud en formato GG.DDDDDD (*) (*) Las coordenadas geográficas corresponden al centroide de la localidad. Localidad La tabla Localidad contiene los IDs de localidad o barrios y el nombre de la misma. También hace referencia al ID de mapa al que pertenece. Las localidades y barrios están en una misma capa. Cada mapa en particular puede tener sólo capa de Barrios, como en el mapa de CABA, en otros casos puede tener sólo capa de localidades, como en varios 21 Compumap® Geocoding partidos del Gran Buenos Aires, y en ciertos casos el mapa puede contener ambas capas (localidades y barrios) que por lo general se solapan. 22 Compumap® Geocoding CREATE TABLE Localidad ( Id int PRIMARY KEY NOT NULL, Id_Localidad int, Id_Mapa int, Nombre varchar(45), ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Localidades CAMPO Id Id_Localidad TIPO Integer Integer KEY PK Id_Mapa Integer FK Nombre Varchar(45) NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Nombre de la localidad en la guía de códigos postales. ID del mapa. Los mapas existentes en la tabla Mapas se relacionan con éstos, aunque hay mapas que no se verán reflejados en dicha tabla. Los mapas no disponibles tienen ID = -1. Nombre del mapa al que corresponde la localidad. Los nombres existen aunque el mapa no esté disponible. Lugares La tabla de Lugares permite definir una dirección cercana a ciertos lugares que no pueden ser nomenclados o georeferenciados debido a la inexistencia de información. Por ejemplo los barrios cerrados o countries pueden ser referenciados a una dirección cercana al mismo sin necesidad de tener información de las calles internas del mismo. La tabla de localidades contiene una lista de más de 170 barrios privados del Gran Buenos Aires, pero los usuarios pueden incorporar sus propios lugares en los mapas de todo el país. En la sección III se indica detalladamente cómo se pueden agregar lugares adicionales en esta 23 Compumap® Geocoding tabla. Los lugares que pueden definirse en esta tabla son aquellos que pertenezcan a un mapa. CREATE TABLE Lugares ( Id int PRIMARY KEY NOT NULL, Lugar varchar(50), Latitud Numeric, Longitud Numeric, Id_Mapa int, Id_Calle int, Id_Calle1 int, Id_Calle2 int, Altura int, ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Lugares CAMPO Id Lugar Latitud Longitud Id_Mapa Id_Calle TIPO Integer Varchar(50) Integer Varchar(45) Integer Integer KEY PK Id_Calle1 Integer FK Id_Calle2 Integer FK Altura Integer FK FK FK NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Nombre del lugar. Latitud en formato GG.DDDDDD Longitud en formato GG.DDDDDD Id de mapa. FK de la tabla Mapas Id de calle en el mapa. FK de la tabla Calles. Id de calle1 en el mapa. FK de la tabla Calles. Id de calle2 en el mapa. FK de la tabla Calles. Altura 24 Compumap® Geocoding Mapas La tabla de Mapas contiene aquellos mapas que han sido adquiridos y volcados a tablas. Cada mapa es el contenedor de ejes viales que se utilizan para nomenclar direcciones. Además, se indica a qué provincia pertenece el mapa a través del campo Id_prov. Esto puede resolver casos en los que los mapas tienen homónimos en diversas provincias, como por ejemplo Ituzaingó (Buenos aires y Corrientes), Colón (Buenos Aires y Entre Ríos), Rawson (Buenos Aires y Chubut), entre muchos otros. CREATE TABLE Mapas ( Id_mapa int PRIMARY KEY NOT NULL, Nombre varchar(50), Id_prov int, ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Mapas CAMPO Id_mapa Nombre Id_prov TIPO Integer Varchar(50) Integer KEY PK FK NULL DESCRIPCION NOT NULL Id de Mapa. Nombre de mapa. Id de provincia a la que pertenece el mapa. FK de la tabla Provincia. Provincia La tabla Provincia es una tabla maestra que contiene todas las provincias del país sin importar si las tablas volcadas tienen mapas de todo el país o no. 25 Compumap® Geocoding CREATE TABLE Provincia ( Id int PRIMARY KEY NOT NULL, Id_prov int, Provincia varchar(40), ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Provincia CAMPO Id Id_Prov Provincia TIPO Integer Integer Varchar(40) KEY PK NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Id de provincia en mapas Compumap. Nombre de la provincia. Segmentos La tabla Segmentos tiene información detallada de cada cuadra de una calle. información que puede obtener de esta tabla se describe en la lista siguiente: a) b) c) d) e) f) La A qué calle pertenece el segmento. A qué mapa pertenece la calle. La altura inicial y final del segmento. Coordenadas geográficas (latitud y longitud) del punto medio del segmento. Localidad o barrio del mapa al que pertenece el segmento. Vértice inicial y final del segmento. Permite conocer las calles o segmentos que cruzan al segmento, en ambos vértices. 26 Compumap® Geocoding CREATE TABLE Segmentos ( Id int PRIMARY KEY NOT NULL, Id_mapa int, Id_calle int, Alt_desde int, Alt_hasta int, PM_lat Numeric, PM_lon Numeric, Id_localidad int, Id_vertini int Id_vertfin int, ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Segmentos CAMPO Id Id_mapa TIPO Integer Integer KEY PK FK Id_Calle Integer FK Alt_desde Alt_hasta PM_lat Integer Integer Numeric PM_lon Numeric Id_localidad Integer Id_vertini Id_vertfin Integer Integer FK NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Id del mapa al que pertence el segmento. FK de la tabla Mapas. Id de calle en el mapa. FK de la tabla Calles. Altura inicial del segmento (*) Altura final del segmento (*) Latitud en formato GG.DDDDDD del punto medio del segmento. Longitud en formato GG.DDDDDD del punto medio del segmento. Id de localidad o barrio al que pertenece el segmento. FK de la tabla Localidad Id del vértice inicial. Id del vértice final. (*) Si la altura en Alt_desde y Alt_hasta es 0 (cero), el segmento no tiene altura. 27 Compumap® Geocoding Sinon_Calle Las tablas que comienzan con el prefijo Sinon_ son tablas utilizadas para definir sinónimos. Los sinónimos pueden referirse a nombres de calle, a nombres de localidades, a nombres de mapas o a nombres de provincias. Un sinónimo es un alias o nombre alternativo de uso común. Esto permite resolver de inmediato, por ejemplo, calles que cambiaron de nombre y que aún no han sido cambiados en el mapa, o que han sido cambiados pero la gente se sigue refiriendo a la calle por su nombre antiguo. Algunas tablas de sinónimos tienen algunos sinónimos ya definidos a modo de ejemplo. En la sección III se indica como incorporar nuevos sinónimos a esta tabla. CREATE TABLE Sinon_Calle ( Id int PRIMARY KEY NOT NULL, Id_mapa int, Id_calle int, Sinonimo varchar(50), ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Sinon_Calle CAMPO Id Id_mapa TIPO Integer Integer KEY PK FK Id_Calle Integer FK Sinonimo Varchar(50) NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Id del mapa al que pertence la calle para la cual se define el sinónimo. FK de la tabla Mapas. Id de calle al que se refiere el sinónimo. FK de la tabla Calles. Nombre del sinónimo. 28 Compumap® Geocoding Sinon_Locali Las tablas que comienzan con el prefijo Sinon_ son tablas utilizadas para definir sinónimos. Los sinónimos pueden referirse a nombres de calle, a nombres de localidades, a nombres de mapas o a nombres de provincias. Un sinónimo es un alias o nombre alternativo de uso común. Esto permite casos en los que el nombre oficial de una localidad no es el que se usa comúnmente, por ejemplo, la localidad de San Francisco Solano suele ser denominada como ‘Solano’, o Gregorio de Laferrere se suele mencionar como ‘Laferrere’. Algunas de estas tablas tienen algunos sinónimos ya definidos a modo de ejemplo. En la sección III se indica como incorporar nuevos sinónimos a esta tabla. CREATE TABLE Sinon_Locali ( Id int PRIMARY KEY NOT NULL, Id_mapa int, Id_Locali int, Sinonimo varchar(50), ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Sinon_Locali CAMPO Id Id_mapa TIPO Integer Integer KEY PK FK Id_Locali Integer FK Sinonimo Varchar(50) NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Id del mapa al que pertenece la localidad para la cual se define el sinónimo. FK de la tabla Mapas. Id de localidad al que se refiere el sinónimo. FK de la tabla Localidad. Nombre del sinónimo. 29 Compumap® Geocoding Sinon_Mapa Las tablas que comienzan con el prefijo Sinon_ son tablas utilizadas para definir sinónimos. Los sinónimos pueden referirse a nombres de calle, a nombres de localidades, a nombres de mapas o a nombres de provincias. Un sinónimo es un alias o nombre alternativo de uso común. Esto permite resolver ambigüedades en el nombre del mapa ya que, por ejemplo, la Ciudad Autónoma de Buenos Aires también es denominada ‘Capital’ o ‘Capital Federal’ o ‘Ciudad de Buenos Aires’ indistintamente. Algunas tablas de sinónimos tienen algunos sinónimos ya definidos a modo de ejemplo. En la sección III se indica como incorporar nuevos sinónimos a esta tabla. CREATE TABLE Sinon_Mapa ( Id int PRIMARY KEY NOT NULL, Id_mapa int, Sinonimo varchar(50), ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Sinon_Mapa CAMPO Id Id_mapa TIPO Integer Integer Sinonimo Varchar(50) KEY PK FK NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Id del mapa para la cual se define el sinónimo. FK de la tabla Mapas. Nombre del sinónimo. 30 Compumap® Geocoding Sinon_Prov Las tablas que comienzan con el prefijo Sinon_ son tablas utilizadas para definir sinónimos. Los sinónimos pueden referirse a nombres de calle, a nombres de localidades, a nombres de mapas o a nombres de provincias. Un sinónimo es un alias o nombre alternativo de uso común. En algunos casos hemos visto que las provincias se denominan con una letra que corresponde a la antigua patente de automotores. La tabla de sinónimos de provincia ya contiene la tabla de letras como sinónimo de cada provincia. En esta tabla se pueden incorporar nuevos sinónimos como ‘Bs. As.’ para Buenos Aires, ‘Mza’ para Mendoza, o ‘Cba’ para Córdoba. Algunas tablas de sinónimos tienen algunos sinónimos ya definidos a modo de ejemplo. En la sección III se indica como incorporar nuevos sinónimos a esta tabla. CREATE TABLE Sinon_Prov ( Id int PRIMARY KEY NOT NULL, Id_Prov int, Sinonimo varchar(50), ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: Sinon_Prov CAMPO Id Id_Prov TIPO Integer Integer Sinonimo Varchar(50) KEY PK FK NULL DESCRIPCION NOT NULL Id de registro, autoincremental. Id de la provincia para la cual se define el sinónimo. FK de la tabla Provincia. Nombre del sinónimo. 31 Compumap® Geocoding TipoCalle La tabla TipoCalle contiene la descripción de los tipos de ejes viales que contiene la tabla calles. Este dato no se usa para nomenclar ya que es simplemente una referencia para conocer si un eje es avenida, autopista, ruta, puente, túnel, calle, bulevar, calle o callejón. CREATE TABLE TipoCalle ( Id_Tipo int PRIMARY KEY NOT NULL, Tipo varchar(50), ) NOTA: Los CONSTRAINTS definidos son exclusivamente para bases de datos SQLite. Esta sentencia podría variar de acuerdo a la base de datos que está utilizando. Defina los CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia CREATE. Tabla: TipoCalle CAMPO Id_tipo Tipo TIPO Integer Varchar(40) KEY PK NULL DESCRIPCION NOT NULL Id de tipo. Descripción del tipo. 32 Compumap® Geocoding Modelo Relacional 33 Compumap® Geocoding Sección III – Funcionalidad y obtención de resultados Introducción Esta sección contiene una serie de ejemplos de funcionalidad para la obtención de resultados utilizando las tablas de la base de datos Geocoding. Los ejemplos se presentan en formato de sentencias SQL y pseudocódigo. Las sentencias SQL que se presentan dentro del pseudocódigo van precedidas por el prefijo “SQL:”. El pseudocódigo no refleja ningún lenguaje de programación en particular, sino que presenta código en idioma español simulando las sentencias de cualquier lenguaje de programación. Es por ello que se utilizan sentencias y funciones básicas para que puedan ser interpretadas por programadores tanto de lenguajes de bajo nivel como de alto nivel. Adicionalmente, en cada ejemplo se describe el proceso que se va a realizar y se agregan comentarios en el pseudocódigo para clarificar estos los conceptos. Convenciones utilizadas Sentencias SQL Las sentencias SQL se muestran tal cual se escribiría en una consulta SQL, indicando los nombres reales de tablas, campos y condiciones. Por ejemplo, para consultar el nombre de la provincia con ID = 230 verá la siguiente sentencia: SELECT Provincia FROM Provincia WHERE Id_prov = ‘230’ En caso de que la sentencia SQL esté embebida en el código, se mostrará el prefijo “SQL:”, como en el siguiente ejemplo: 34 Compumap® Geocoding … sentencia … … sentencia … … sentencia … SQL: SELECT * FROM Mapas WHERE Nombre IN ('Castelar') … sentencia … … sentencia … … sentencia … Pseudocódigo Como mencionamos anteriormente, el pseudocódigo describe sentencias de un programa sin relación a un lenguaje de programación específica ni su sintaxis particular. Esto se hace para demostrar con un lenguaje plano y básico cómo utilizar los recursos de cualquier lenguaje para obtener los resultados deseados. Esto se hace así debido a la gran cantidad de lenguajes de programación y sus diferentes reglas sintácticas. Fuente del pseudocódigo y sentencias SQL Se utiliza la fuente Courier New. Comentarios Los comentarios van todos precedidos por un apóstrofe (‘). A partir del apóstrofe y hasta el fin de la línea, cualquier texto que aparezca será considerado un comentario. Comentario de toda la línea: ‘ Éste es un comentario de toda la línea … sentencia … Comentario de una sentencia … sentencia … ‘Este comentario hace referencia a la sentencia Variables Las variables no se dimensionan y se asumen numéricas o alfanuméricas de acuerdo a su primer asignación. 35 Compumap® Geocoding Listas Las listas son colecciones de 1 a N elementos, a los cuales se les asigna valores mediante su índice. Es el equivalente a un vector o array. Condiciones Representa el IF … then … else … end. Su formato es el siguiente: SI <Condición> ENTONCES … sentencias … SINO … sentencias … FIN También pueden anidarse diversas condiciones, aunque si se deben anidar varias condiciones, será mejor usar la sentencia CASOS: CASOS CASO <condición1> … sentencias … CASO <condición2> … sentencias … CASO <condición3> … sentencias … CASO <condiciónN> … sentencias … SINO ‘Las sentencias a continuación se ejecutan para toda ‘condición que no cumpla con las anteriores … sentencias … FIN Repeticiones Las repeticiones son bucles o loops. Se usan dos tipos de repeticiones: ‘MIENTRAS’ y ‘PARA CADA’. Para salir de una repetición dada alguna condición que no sea la natural de la repetición, se usa el término ‘SALIR’. ‘Ejemplo de repetición PARA CADA ‘Colección puede ser una lista o una secuencia, por ejemplo, ‘1..100 indica que se repetirá 100 veces 36 Compumap® Geocoding ‘[PASO x] Opcional, indica pasos de la secuencia, por defecto ‘el paso es 1 PARA CADA N en <Colección> [PASO x] … sentencias … SI <Condición> ENTONCES … sentencias … SINO SALIR FIN FIN Caracteres Extendidos En español existen varios caracteres cuyo código ASCII es superior a 127, es decir caracteres extendidos, y equivalen a caracteres como á, é, í, ó, ú, ü, º, ª, etcétera. Para poder ser comparados con éxito, estos caracteres deben ser resueltos a través de una función que permita comparar dos textos equivalentes, una que tenga acento y la otra no. Por ejemplo: Díaz es distinto a Diaz Güiraldes es distinto a Guiraldes San Martín es distinto a San Martin Esto es muy importante ya que tanto en las tablas de la base de datos como en el ingreso de los data-entry puede estar escrito de una forma u otra. 37 Compumap® Geocoding Ejemplos Dado el nombre de localidad, devolver su ID de Mapa Recuerde que un mapa puede representar un partido del Gran Buenos Aires, una localidad, una ciudad o una comuna rural. Los mapas que representan un partido contienen localidades o barrios, por lo tanto lo conveniente será buscar primero el mapa, y si no se obtienen resultados, buscar la localidad. ‘ Obtener el ID de mapa y nombre completo de Ballester ‘Primero buscamos en la tabla Mapas Select Id_mapa, Nombre from Mapas where Nombre='Ballester' Resultado: Nulo No hemos obtenido resultados ya que Villa Ballester es una localidad del Partido de San Martín en el Gran Buenos Aires, por lo tanto repetiremos la búsqueda en la tabla Localidad: Select Id_mapa, Nombre from Localidad where Nombre='Ballester' Resultado: Nulo Tampoco hemos obtenido resultado debido a que no existe ninguna localidad que se llame “Ballester”. Por lo tanto, usaremos el operador LIKE para volver a probar la búsqueda: Select Id_mapa, Nombre from Localidad where Nombre LIKE '%Ballester%' Resultado: Id_mapa = 5, Nombre = Villa Ballester. 38 Compumap® Geocoding La razón por la que no se encontró anteriormente la localidad en la tabla se debe a que la localidad no se llama exactamente “Ballester” sino “Villa Ballester.”. El punto (.) que aparece al final del nombre de la localidad se debe a restricciones heredadas de versiones anteriores de la cartografía que no permitía dos objetos con igual nombre (hay casos donde el partido puede tener localidades homónimas, como “Hurlingham” o “Vicente López”.). Lo que puede hacer para evitar que las localidades aparezcan con ese punto final, es eliminarlo antes de popular la tabla. Por otro lado, tenga en cuenta siempre que haga la búsqueda con el operador LIKE agregar el signo “%” delante y detrás del texto buscado, ya que de no hacerlo será lo mismo a buscar con el operador “=”. Dado el ID de Mapa, obtener el nombre del mapa Hemos obtenido desde la tabla de localidades el ID del mapa de Villa Ballester. Para conocer el nombre del partido, ejecutamos la siguiente sentencia SQL: Select Nombre from Mapas where Id_mapa='5' Resultado: Nombre = San Martín Es decir que la localidad de Villa Ballester se encuentra en el partido de San Martín. Dado un código postal, obtener el nombre del mapa Supongamos que un operador está tomando una dirección y solicita que su interlocutor le diga su código postal, el cual es 1653. Con este dato, se buscará en la tabla Gcodes para obtener el ID de Mapa, y Nombre del Mapa. Se ejecuta la siguiente sentencia SQL: Select ID_Mapa, NombreMapa from Gcodes where Cpostal='1653' Resultado: Id_mapa = 5, NombreMapa = San Martín También podríamos haber realizado la búsqueda anterior utilizando el nombre de la localidad en lugar del código postal, directamente en la tabla Gcodes: Select ID_Mapa, NombreMapa from Gcodes where Localidad_Postal LIKE '%ballester%' Resultados: Id_mapa = 5, NombreMapa = San Martín Id_mapa = 4059, NombreMapa = Ballesteros Id_mapa = -1, NombreMapa = Ballesteros Sud 39 Compumap® Geocoding Si acotamos la búsqueda a la Provincia de Buenos Aires, y sabemos que el ID de Provincia para Buenos Aires es 230, hacemos la siguiente la consulta: Select ID_mapa, NombreMapa from Gcodes where Localidad_Postal LIKE '%ballester%' AND Id_Prov = '230' Resultado: Id_mapa = 5, NombreMapa = Villa Ballester. Nota: En la primera consulta hemos obtenido varios resultados debido a que la tabla Gcodes contiene información de localidades de todo el país, georeferenciadas por coordenadas geográficas y con código postal, además de indicar a que provincia pertenece, y a qué departamento o partido. También contiene información de mapas como ID y nombre de mapas que no hayan sido volcados a las tablas de Geocoding. El id_mapa -1 de la localidad ‘Ballesteros Sud’ indica que esa localidad no tiene mapa disponible. Si utiliza esta tabla para realizar búsquedas, asegúrese que el Id_mapa obtenido exista en la tabla Mapas, ya que si no existe no podrá obtener información de las calles, altura, cruces, etcétera. Obtener datos diversos de una localidad Consultando la tabla Gcodes se podrá obtener diferentes datos de la misma como código postal, coordenadas geográficas, partido o departamento al que pertenece, provincia a la que pertenece y si tiene mapa disponible o no, y si tiene mapa disponible buscar si tiene información de calles en las tablas de Geocoding. Por ejemplo, ejecutamos la siguiente sentencia: select id_prov, PdoDto, Cpostal, Id_Mapa, NombreMapa, Latitud, Longitud from Gcodes where Localidad_Postal LIKE 'Mar del Plata' Resultados: id_prov = 230 PdoDto = GENERAL PUEYRREDON Cpostal = 7600 40 Compumap® Geocoding Id_Mapa = 108 NombreMapa = Mar del Plata Latitud = -38.0453 Longitud = -57.5617 Obtener lista de mapas de una provincia Si usted ha adquirido los mapas de todo el país, o de las principales regiones, seguramente desee conocer cuáles son los mapas contenidos en una provincia en particular. Para esto, lo conveniente será primero popular dos listas o una matriz de 2 columnas, una con los id de provincias y otra con los nombres de las provincias. Luego, se despliega la lista de nombres de provincia para que el usuario elija la deseada. De la lista de Id de provincias se obtiene el Id, y se ejecuta la siguiente sentencia SQL: select id_mapa, Nombre from Mapas where ID_prov = '230' Resultado: Listas de IDs y nombres de mapas de la provincia buscada, o lista vacía si no hay mapas de la provincia buscada. Dado ID de Calle y Mapa obtener Nombre y rango de alturas válido En este ejemplo demostraremos cómo obtener información de la calle una vez nomenclada. La información que nos interesa es el nombre de la calle, y el rango de alturas válido de la misma. select Nombre_calle, alt_desde, alt_hasta from Calles where id_calle = '893' AND id_mapa = '0' Resultado: Nombre_calle = Girardot alt_desde = 1 alt_hasta = 1999 Esta consulta resultará útil para nomenclar calles y testear la validez de la altura buscada. Por ejemplo, con los resultados obtenidos podrá concatenar una cadena de caracteres del tipo Girardot [1 - 1999] para que el usuario pueda resolver ambigüedades o tenga información del rango de alturas en caso de obtener un mensaje “ALTURA INVALIDA” al nomenclar la dirección. 41 Compumap® Geocoding Por ejemplo, supongamos que el usuario desea nomenclar la dirección “Mitre 4024” en CABA. Primero buscamos las calles que contengan el texto “Mitre” con ID_mapa = 0 (CABA): select Nombre_calle, alt_desde, alt_hasta from Calles where Nombre_calle LIKE '%Mitre%' AND id_mapa = '0' Resultados: Mitre Emilio [1 - 1999] Mitre Bartolomé [101 – 4499] En este caso obtenemos una ambigüedad ya que existen 2 calles con el texto “Mitre” en su nombre, pero por la altura podemos resolver la ambigüedad ya que al 4024 sólo puede corresponder a la calle “Mitre Bartolomé”. Si la altura informada fuera un valor entre 101 y 1999 (alturas comunes para ambas calles “Mitre”) la ambigüedad sería más difícil de resolver si no se cuenta con más información como entrecalles, Localidad/Barrio, o código postal. Obtener el código postal (CABA) dado el ID_calle y la altura Siguiendo con el ejemplo anterior, buscaremos el código postal que le corresponde a Mitre 4024 en CABA. Para ello, haremos la siguiente consulta: ‘Primero obtenemos el ID_calle de “Mitre Bartolomé” select Id_Calle from Calles where Nombre_calle = 'Mitre Bartolomé' Resultado: Id_Calle = 1317 ‘ Luego obtenemos el CP con el Id_calle y la altura select Codigo_Postal from CP_CABA where Id_calle_Mapa = '1317' AND alt_desde < '4024' AND alt_hasta > '4024' 42 Compumap® Geocoding Resultado: Codigo_Postal = 1201 Si el resultado de esta consulta es nulo, puede deberse a que la calle tenga el mismo código postal en toda su extensión, en cuyo caso la altura inicial y final será 0 (cero). Para resolver este caso, deberá volver a realizar la consulta de la siguiente forma: select Codigo_Postal from CP_CABA where Id_calle_Mapa = '1090' Resultado: Codigo_Postal = 1419 Obtener coordenadas de la cuadra donde está la dirección Seguimos con el mismo ejemplo, y buscamos el segmento de cuadra de Mitre Bartolomé 4024 en CABA para obtener la latitud y longitud del punto medio de la cuadra. Ya conocemos el ID_Calle = 1317 y el ID_mapa = 0. Para ello realizamos la siguiente consulta: select PM_lat, PM_lon from Segmentos where Id_Mapa = '0' AND ID_Calle = '1317' AND Alt_desde < '4024' AND Alt_hasta > '4024' Resultado: PM_lat = -34.6098 PM_lon = -58.423 Obtenidas las coordenadas geográficas se podrá consultar la ubicación en el mapa, en cualquier aplicación de mapas o en Compumap Office. También podrá enviar las coordenadas obtenidas a un dispositivo GPS Garmin utilizando el conversor CMP2GAR (Compumap a Garmin) que acompaña a la instalación de Compumap® Office y Distribución. 43 Compumap® Geocoding 44 Compumap® Geocoding Cruces, Esquinas y Entrecalles Con los campos Vertini y Vertfin de cada segmento podemos obtener el ID de calle que cruza o hace esquina en cualquiera de estos vértices. Los vértices son los puntos inicial y final de cada segmento (línea recta). Existen casos donde el vértice no tiene cruce de otras calles, esto se debe a que hay vértices que son de curvatura, como por ejemplo en una rotonda o acceso a autopista. Adicionalmente, el vértice final de un segmento tiene el mismo número al vértice inicial del segmento siguiente, excepto donde la calle se corta por una plaza, paredón, o vía férrea. Todo segmento tiene dos vértices, uno inicial y otro final. Para buscar las calles que cruzan a ese segmento hay que obtener el número del vértice inicial y final, y luego buscar todas las calles únicas y que no coincidan con el ID de calle del segmento. Esto nos dará una lista de las calles que cruzan en cada punto. Existe la posibilidad de que un segmento sea cruzado por más de una calle, es por ello que se utilizan listas para almacenar los resultados. Tome por ejemplo la Avenida Rivadavia en CABA, donde las calles cambian de nombre a uno y otro lado; en este caso cada segmento es cruzado por al menos dos calles diferentes salvo algunas excepciones. Por ejemplo, a la altura de Plaza Miserere, la Av. Rivadavia se cruza con la Av. Pueyrredón y con la Av. Jujuy en la misma esquina de la plaza. La mayoría de las ciudades tienen una calle o avenida de “corte”, estas calles al igual que la Av. Rivadavia, son calles desde la cual nacen las calles y se originan las alturas hacia uno y otro lado. Otra particularidad es el caso donde la calle cambia de nombre, como por ejemplo en el segmento final de la Av. Pueyrredón se detectará el cruce de Av. Rivadavia y la continuación de la Av. Jujuy, la cual no es transversal con Pueyrredón, pero de todos modos tendrá igual número de vértice y será detectada como cruce. Obtener cruces de una calle Para obtener todas las calles que cruzan a otra, primero debemos obtener una lista de vértices sin repeticiones para luego buscar nuevamente en la tabla Segmentos las coincidencias en esta lista de vértices. En el siguiente ejemplo obtendremos una lista con los cruces de la calle Carabelas en CABA. Para ello obtenemos primero el ID de calle desde la tabla Calle y luego buscamos los vértices únicos desde la tabla de segmentos: ‘ Obtengo ID de calle de Carabelas select Id_Calle, Nombre_calle from Calles where Nombre_calle LIKE '%Carabelas%' AND Id_mapa = '0' 45 Compumap® Geocoding Resultado: ID_Calle = 396 Nombre_Calle = Carabelas Luego obtenemos las listas de vértices iniciales y finales de los segmentos: select Id_vertini, Id_vertfin from Segmentos where Id_calle = '396' AND Id_mapa = '0' Resultado: Id_ Vertini 2718 11439 Id_Verfin 11439 2719 En este ejemplo, hemos usado una calle de sólo dos segmentos para ejemplificar con mayor claridad el concepto. Note que los resultados muestran los vértices inicial y final de cada segmento. Con estos vértices hay que crear una lista de vértices eliminando los duplicados. La lista debería quedar así: Lista de vértices = 2718, 11439, 2719 Recuerde que el vértice final de un segmento es igual al vértice inicial del segmento anterior, por lo tanto el ID de vértice 11439 aparece una sola vez en la lista de vértices. A continuación buscamos cada uno de los vértices de la lista en la tabla de segmentos sin tener en cuenta el ID de Calle 396 ya que la calle Carabelas no se cruza con si misma: select distinct Id_calle from Segmentos where Id_calle <> '396' AND Id_mapa = '0' AND (ID_VERTINI = '2718' OR ID_VERTFIN = '2718') Resultado: Id_calle = 1516 Note el uso de la cláusula “distinct” para evitar los resultados duplicados y la condición Id_calle <> '396'para evitar obtener la misma calle que estamos evaluando. 46 Compumap® Geocoding Repetimos la búsqueda con los otros dos ID de vértices de la lista y obtenemos como resultado los IDs de calle 1774 y 1707. A continuación podemos obtener los nombres de estas calles desde la tabla Calles: select Id_calle, Nombre_Calle from Calles where Id_calle = '1516' Resultado: Id_calle = 1516 Nombre_Calle = Perón Juan Domingo Tte. Gral. select Id_calle, Nombre_Calle from Calles where Id_calle = '1774' Resultado: Id_calle = 1774 Nombre_Calle = Sarmiento select Id_calle, Nombre_Calle from Calles where Id_calle = 1707' Resultado: Id_calle = 1707 Nombre_Calle = Saenz Peña Roque Diagonal Si verificamos el mapa, veremos que efectivamente la calle Carabelas se cruza con las calles obtenidas: 47 Compumap® Geocoding Validación de existencia de una esquina Supongamos, por ejemplo, que deseamos saber si la Avenida Belgrano se cruza con la calle Castro Barros en CABA. Para ello obtenemos los IDs de calle de ambas arterias, y encontramos que “Belgrano Av.” tiene ID de calle 228, y “Castro Barros Av." tiene ID de calle 436. La búsqueda de coincidencias en ID de vértices entre ambas calles puede hacerse tanto desde un programa como desde la base de datos. Para este ejemplo se muestra cómo hacerlo con sentencias SQL. ‘ Primero creamos dos vistas ‘Una con todos los vértices de Belgrano 48 Compumap® Geocoding ‘ Y otra para los vértices de Castro Barros CREATE VIEW [Cruces Calle] AS SELECT ID_calle,ID_Vertini,ID_vertfin FROM Segmentos WHERE id_Calle = '228' AND id_mapa = ‘0’ CREATE VIEW [Cruces Calle1] AS SELECT ID_calle,ID_vertini,ID_Vertfin FROM Segmentos WHERE id_Calle = '436' AND id_mapa = ‘0’ ‘ Luego hacemos un JOIN de ambas vistas para que muestre si ‘ hay vértices coincidentes entre las dos calles SELECT * FROM [Cruces Calle] JOIN [Cruces Calle1] ON [Cruces Calle].Id_Vertini OR [Cruces Calle].Id_Vertfin OR [Cruces Calle].Id_Vertini OR [Cruces Calle].Id_Vertfin = = = = [Cruces [Cruces [Cruces [Cruces Calle1].Id_vertini Calle1].Id_vertfin Calle1].Id_vertfin Calle1].Id_vertini Note que la condición se hace cuatro veces para cubrir todas las posibilidades tanto en el vértice inicial como en el final. El resultado de la búsqueda se muestra en la siguiente figura: En el resultado puede observarse que el único ID de vértice coincidente en las cuatro filas es el vértice 1954. Si queremos obtener los datos de los segmentos de la Av. Belgrano (228) que cruzan con Castro Barros haremos la siguiente consulta: SELECT * FROM Segmentos WHERE (ID_Vertini = '1954' OR ID_Vertfin = '1954') AND ID_calle = '228' AND Id_mapa = '0' 49 Compumap® Geocoding Y el resultado puede observarse en la siguiente figura: Si bien esta verificación puede hacerse a través de las sentencias SQL, se recomienda desarrollar un procedimiento o función programada dentro de sus sistemas de gestión, ya que esto seguramente le resultará más rápido que hacerlo por SQL. Si descubre que el proceso para realizar esta verificación no es eficiente, podrá considerar generar tablas de cruces e incluirlas en la base de datos para que la búsqueda sea más directa. Por último, en este ejemplo si el resultado hubiera tenido valor nulo significaría que no existe ningún cruce entre ambas calles. Dada una dirección obtener las entrecalles En este ejemplo buscaremos las dos calles que cruzan a un segmento dado. Para ello hemos elegido un segmento donde uno de sus vértices es un vértice de curvatura, por lo tanto no tendrá cruce en ese vértice. Lo que hacemos en este caso es buscar el segmento anterior o siguiente de la calle con igual vértice y buscar el cruce en el vértice opuesto de este último segmento. La dirección buscada es “Peribebuy 1152 – Ituzaingó”. El ID de mapa de Ituzaingó es 19, y el ID de calle es 128. A continuación se muestra la sentencia SQL para buscar el segmento: SELECT ID_Vertini, ID_Vertfin FROM Segmentos WHERE ID_calle = '128' AND Id_mapa = '19' AND Alt_desde < '1152' AND Alt_hasta > '1152' Resultado: ID_Vertini = 653 ID_Vertfin = 654 Con estos IDs de vértice, buscamos las calles que cruzan, es decir las calles que tienen coincidencia con el ID. 50 Compumap® Geocoding SELECT DISTINCT FROM Segmentos WHERE Id_mapa = AND (ID_Vertini AND ID_Calle <> ID_Calle '19' = '653' OR Id_vertfin = '653') '128' Resultado: NULO La última condición en la cláusula WHERE excluye a la calle Peribebuy. Como el resultado ha sido nulo, buscamos nuevamente el cruce pero esta vez con el segmento anterior, ya que el vértice 653 es el vértice inicial del segmento buscado originalmente y esto significa que el vértice final del segmento anterior es el que tendrá igual ID de vértice (653). Tenga en cuenta que si al hacer esta búsqueda vuelve a obtener un resultado NULO, no se trata de un error sino de que se ha elegido una calle cortada (por ejemplo una calle cortada por una vía de FFCC, o por un río, arroyo, etc.). En el segmento de una calle cortada, sólo habrá un cruce de calle. Buscamos entonces el ID de vértice inicial del segmento anterior para obtener el nuevo cruce. SELECT ID_vertini FROM Segmentos WHERE Id_mapa = '19' AND Id_vertfin = '653' AND ID_Calle = '128' Resultado: ID_Vertini = 652 Entonces repetimos la búsqueda del ID de Calle con este nuevo vértice: SELECT DISTINCT FROM Segmentos WHERE Id_mapa = AND (ID_Vertini AND ID_Calle <> ID_Calle '19' = '652' OR Id_vertfin = '652') '128' Resultado: ID_Calle = 87 51 Compumap® Geocoding Y así obtenemos el ID de la primer calle que cruza. Repetimos la búsqueda para obtener el ID de calle del segundo cruce: SELECT DISTINCT FROM Segmentos WHERE Id_mapa = AND (ID_Vertini AND ID_Calle <> ID_Calle '19' = '652' OR Id_vertfin = '652') '128' Resultado: ID_Calle = 88 Finalmente, buscamos los nombres de las calles con ID 87 e ID 88 y así obtenemos la dirección completa con entrecalles. SELECT Nombre_Calle FROM Calles WHERE Id_mapa = '19' AND (ID_Calle = '87' OR ID_Calle = '88') Resultado: Nombre_Calle = “Quesada Coronel”, “Carabobo” Entonces, la dirección completa con entrecalles sería “Peribebuy 1152 entre Quesada Coronel y Carabobo – Ituzaingó” La siguiente es una imagen que muestra en el mapa el segmento buscado. Note la curvatura del mismo: 52 Compumap® Geocoding Uso de Sinónimos Los sinónimos son aliases de nombres que pueden resolver la forma de encontrar un nombre de objeto realizando la búsqueda por nombres alternativos al real. Compumap® Geocoding viene provisto de cuatro tablas de Sinónimos: 1) 2) 3) 4) Sinónimos de Provincias Sinónimos de Mapas Sinónimos de Localidades Sinónimos de Calles Los sinónimos pueden resolver diversas alternativas con los nombres, como por ejemplo: a) Nombres que han cambiado y que popularmente se sigue usando el nombre antiguo. Por ejemplo, la Av. Rivadavia en Merlo hace algunos años se cambió a “Perón Juan D. Pte.”, pero popularmente se sigue usando la denominación “Rivadavia”. b) Nombres que han cambiado, pero los cambios aún no se han reflejado en los mapas y tablas de Geocoding. Por ejemplo, si la calle “A” ha cambiado de nombre por “B” y popularmente se la comienza a denominar como “B”, puede definirse al nombre “B” como sinónimo de “A”. c) Escritura incorrecta de nombres extranjeros o complejos. Por ejemplo, cuando se escriben nombres con errores de ortografía como en “O’higgins”, “O’brien”, “Hurlingham”, “Fotheringham”, “Houssay”, etc. Los sinónimos de estas calles podrían reflejar las diversas formas en que se pueden escribir de forma incorrecta. 53 Compumap® Geocoding d) Localidades con diversas denominaciones. Por ejemplo, la localidad de “Bavio” también se denomina “General Mansilla”, “Estación Bavio”, “Mansilla”, etcétera. e) Nombres muy largos que se reducen popularmente. Por ejemplo, la “Avenida Del Libertador General San Martín” suele denominarse como “Libertador”, “San Fernando del Valle de Catamarca” suele denominarse como “Catamarca” o “Catamarca Capital”. f) Calles que tienen más de una denominación, por ejemplo calles que tienen número y nombre. En estos casos, el nombre en el mapa refleja el nombre o número dependiendo de cuál es el de uso común. Por ejemplo, en la ciudad de La Plata se usan popularmente los números, pero las calles también tienen nombre. En el partido de San Martín y 3 de Febrero, se usan popularmente los nombres de calle, que además tienen una denominación numérica. Si bien algunas de las tablas se entregan con algunos sinónimos a modo de ejemplo, es responsabilidad del área competente realizar la carga de nuevos sinónimos como así también desarrollar un procedimiento que permita agregar nuevos sinónimos a estas tablas. Para agregar sinónimos, se podrá desarrollar un procedimiento simple que “busque” el nombre al que se desee aplicar un sinónimo (o bien mostrar una lista de nombres para que el usuario seleccione el nombre del objeto a aplicarle el sinónimo) y luego obtener el ID de objeto para aplicarle el sinónimo. Por ejemplo, las calles pueden tener sinónimos pero antes de encontrar el ID de la calle habrá que definir primero a qué mapa pertenece dicha calle. Ver descripción de tablas en la sección II de este manual. Para ilustrar con un ejemplo, crearemos sinónimos para ambas colectoras de la Autopista del Oeste en Ituzaingó. Para ello, primero obtenemos el ID de Mapa de Ituzaingó: select ID_Mapa, Nombre from Mapas where Nombre LIKE '%ituz%' Resultado: ID_Mapa = 19 Nombre = Ituzaingó Luego buscamos el ID de calles de ambas colectoras: 54 Compumap® Geocoding select ID_calle, Nombre_Calle from Calles where Nombre_Calle LIKE '%colect%' AND ID_Mapa = '19' Resultado: ID_Calle 493 492 435 437 487 488 Nombre_Calle S Colectora Norte O E Colectora Norte N Colectora Acceso Oeste (Norte) Colectora Acceso Oeste (Sur) E Colectora Sur N S Colectora Sur E De la lista resultante, descartamos los ejes que comienzan con la letra ‘E’ o ‘S’ ya que estos son rampas de acceso a la autopista, tanto de ‘E’ntrada como de ‘S’alida. Así nos quedan únicamente los IDs 435 y 437 como colectora norte y colectora sur. Las colectoras actualmente tienen el nombre “Presidente Perón”, pero antiguamente se denominaba Gaona. Por lo tanto a cada una de ellas se la conoce como colectora, como Perón o como Gaona indistintamente. En el siguiente ejemplo incorporamos algunos sinónimos a la tabla Sinon_Calle: INSERT INTO Sinon_Calle (ID_mapa,ID_Calle,Sinonimo) VALUES ('19', '435', 'Perón') INSERT INTO Sinon_Calle (ID_mapa,ID_Calle,Sinonimo) VALUES ('19', '435', 'Gaona') INSERT INTO Sinon_Calle (ID_mapa,ID_Calle,Sinonimo) VALUES ('19', '437', 'Perón') INSERT INTO Sinon_Calle (ID_mapa,ID_Calle,Sinonimo) VALUES ('19', '437', 'Gaona') La búsqueda de sinónimos debería ser realizada cuando cualquier otra búsqueda ha fracasado, como la búsqueda de nombre de calle mediante los operadores “=”, “LIKE”, y/o la función Soundex(). 55 Compumap® Geocoding Lugares La tabla Lugares permite realizar búsquedas de direccione donde las calles o domicilios no figuran en el catastro, como por ejemplo barrios de emergencia, barrios cerrados, countries, etcétera. La tabla se provee con los datos de más de 170 barrios cerrados del Gran Buenos Aires. Nuevos registros se podrán incorporar de dos formas, dependiendo si ha adquirido o no Compumap® Office junto a Compumap® Geocoding. Además del nombre, los lugares contienen las coordenadas geográficas y datos del domicilio cercano a dichas coordenadas. Incorporar lugares con Compumap® Office Esta es la forma más rápida para incorporar nuevos lugares a la tabla. El proceso de incorporación tiene varios pasos: 1) Determinar las coordenadas geográficas del lugar que se desea incorporar. Esto se puede hacer desde Compumap o cualquier otro mapa que tenga disponible. Las coordenadas deben estar en formato GG.DDDDDD (grados y decimales de grado) tanto para la latitud como la longitud. 2) Determinar la dirección más cercana a las coordenadas obtenidas. Con Compumap® Office hay varias formas de hacer esto, dependiendo de si se van a incorporar varios Lugares o sólo uno. Si va a incorporar un único lugar, será conveniente ingresar manualmente a un rubro el ítem por coordenadas; por el contrario, si se van a ingresar varios lugares será conveniente generar una tabla CVS (valores separados por coma) que contenga el nombre del lugar y luego importarla al rubro. 3) Exportar el rubro y de allí tomar los datos que deban incluirse en la tabla Lugares. 4) Insertar el registro en la tabla Lugares con los datos obtenidos. Para mostrar un ejemplo, incorporaremos a la Tabla Lugares el “Barrio de Suboficiales 1ª. Brig. Aérea de El Palomar”: 1) Identificamos en el mapa el lugar a agregar, colocamos el cursor en el punto donde está el lugar a agregar y oprimimos la tecla G, lo cual nos devuelve la latitud y longitud de la posición del cursor en formato “GG.DDDDDD”: 56 Compumap® Geocoding Las latitudes del hemisferio (S)ur se convierten a negativas, y las longitudes del hemisferio oeste (W) también. Con esto obtenemos las siguientes coordenadas del punto: Latitud: -34.610257 Longitud: -58.599783 Nota: Con seis decimales de grado se obtiene una precisión bastante exacta del punto. 2) Obtenidas las coordenadas, podemos obtener la dirección más cercana al punto. Para ello creamos un rubro llamado Lugares desde el diálogo de referencias y asignamos un icono que represente al punto. 57 Compumap® Geocoding 3) Seleccionamos el rubro “Lugares” y agregamos un ítem con nombre “Bo. Suboficiales 1ª. Brig. Aerea” y luego seleccionamos el casillero “Por coordenadas” e ingresamos las coordenadas obtenidas anteriormente. 58 Compumap® Geocoding Al hacer clic en Aceptar, se incorpora el ítem al rubro asignándole en este caso la esquina más cercana al punto marcado por las coordenadas. Note que en la siguiente imagen ya aparece la dirección, en este caso la esquina de la calle Tte. Ballester con la calle Villar en el partido de Morón. 59 Compumap® Geocoding Una vez incorporado el lugar al rubro, podemos consultarlo en el mapa para verificar las coordenadas, y la dirección que se ha asignado como más cercana. Para ello se selecciona el nombre del ítem en el panel derecho y hace clic en el botón Aceptar. 60 Compumap® Geocoding 4) Finalmente, exportamos el rubro a un archivo CSV para obtener los datos que restan para incorporar el lugar a la tabla. Para hacer esto seleccionamos el rubro Lugares y hacemos clic en el botón EXPORTAR. Se abre un diálogo donde debemos indicar el nombre del archivo que vamos a guardar y el directorio donde queremos almacenarlo. 61 Compumap® Geocoding 5) Abra el archivo CSV que acaba de exportar, y obtenga los datos necesarios para generar la dirección del lugar: 62 Compumap® Geocoding Los datos que nos interesan son: Nombre = Bo. Suboficiales 1ª Brig. Aerea ID Calle = 751 IDCalle1 = 743 IDCalle2 = -1 Altura = -1 IDPartido = 17 Latitud: -34.610257 Longitud: -58.599783 Con los datos obtenidos incorporamos el lugar a la tabla de lugares con la siguiente sentencia SQL: INSERT INTO Lugares (Lugar,Latitud,Longitud, Id_Mapa, Id_Calle,ID_Calle1,ID_Calle2,Altura) VALUES ('Bo. Suboficiales 1ª Brig. Aerea', '-34.610257', '-58.599783','17','751','743','-1','-1') Incorporar lugares sin Compumap® Office Si no adquirió Compumap® Office junto a Compumap® Geocoding, usted podrá obtener los datos para incorporar un lugar de otras fuentes geográficas como Google Maps, Google Earth, Mapsource, entre muchos otros. Para ejemplificar este proceso usaremos Google Maps, usando el mismo ejemplo anterior: 63 Compumap® Geocoding 1) Abra Google Maps y habilite la opción Satélite. 2) Ubique el punto a marcar, y haga clic derecho en la posición deseada. Luego seleccione la opción “Qué hay aquí?” desde el menú emergente. Esto mostrará en la parte superior las coordenadas del punto (indicado en el mapa con una flecha verde) y la dirección más cercana en el panel izquierdo (indicada en el mapa con un globo rojo). 3) Con esto obtenemos la latitud y la longitud, y la dirección más cercana a dicho punto (Aviador José María Carosella 739-799 en El Palomar). 4) La dirección deberá ser nomenclada, es decir deberá buscarse el ID de mapa correspondiente a la localidad de El Palomar y el ID de calle de la calle Carosella. 5) Por último inserta un registro en la tabla de lugares con los datos obtenidos, teniendo en cuenta que aquellos datos que no se informan deben ingresarse con valor “-1”. 64 Compumap® Geocoding 65 Compumap® Geocoding Soundex – Búsqueda fonética de Nombres Algunas bases de datos, como SQL Server, tienen una función para convertir una cadena de caracteres en un código fonético de cuatro caracteres. Estos códigos fonéticos se utilizan para encontrar palabras que suenan similar, por lo tanto no importa si la palabra está bien o mal escrita, a través de esta función se podrán obtener las palabras que suenan de forma similar. Si la base de datos que utiliza no soporta la función Soundex, usted puede programar esta función para hacer las conversiones de nombres. Tenga en cuenta que muchos nombres se componen con varias palabras. Para hacer comparaciones, los campos de las tablas que contengan nombres como provincia, localidad, mapa, calle, etcétera; deberán estar previamente codificados por soundex, palabra por palabra. De esta manera podrá comparar cada una de las palabras en forma independiente, y podrá minimizar los falsos positivos en la comparación. Aunque esta función está ampliamente documentada en la web, daremos un detalle de la codificación por soundex para facilitarle la implementación en su sistema. Función Soundex Soundex(cadena de caracteres) Argumentos Cadena de caracteres: Expresión alfanumérica de caracteres. Devuelve Varchar(4) Comentarios La cadena de caracteres del argumento debería ser separado por “tokens” en una lista para obtener la cantidad de palabras a comparar. A continuación se presenta un ejemplo de la función token(): ‘ Crear una lista con las palabras de una cadena. Lista_Palabras = Token(<cadena>, <Separador>) ‘ El segundo argumento indica cual es el separador de ‘ palabras, normalmente un espacio (“ “). La Función Token() devuelve una lista de n elementos conteniendo las palabras de la cadena. 66 Compumap® Geocoding La razón por la que debe separar por palabras la cadena de caracteres es que de no hacerlo la función Soundex() codificará únicamente la primer palabra y la búsqueda se hará sólo por este código, devolviendo más resultados coincidentes. Ilustramos esto con un ejemplo: Supongamos que se desea buscar por soundex la columna Localidad_Postal en la tabla de Gcodes la cadena “Mar del Plata”. EJEMPLO SIN TOKENS: COD_SNDX = Soundex(“Mar del Plata”) Resultado: COD_SNDX = M600 EJEMPLO CON TOKENS: ListaPalabras = Token(“Mar del Plata”, “ “) POR CADA n EN ListaPalabras ListaSoundex = Agregar(Soundex(n)) FIN Resultado: ListaSoundex[1] = M600 ListaSoundex[2] = D400 ListaSoundex[3] = P430 En el primer ejemplo, se obtendrán diversos resultados al comparar soundex con el código M600. Por ejemplo, los resultados de la comparación serán “Mar del Plata”, “Mar Azul”, “Mar Chiquita”, “Mar de las Pampas”, “Mar del Tuyú”, entre muchos otros. Con el segundo ejemplo, sólo obtendremos como coincidencia la localidad de Mar del Plata. Descripción del Código Soundex El primer carácter de código es la primera letra de la cadena de caracteres, y desde el segundo al cuarto carácter del código son números que representan a las letras en la cadena según se detalla en la tabla más abajo. Las vocales se ignoran a menos que la primera letra de la cadena sea una vocal o una letra ignorada. Se agregarán ceros (0) al final del código si fuera necesario, para generar un código de cuatro caracteres. 67 Compumap® Geocoding La siguiente tabla define los números que representan a cada una de las letras: Número 1 2 3 4 5 6 Ignoradas Letras que representa B, F, P, V C, G, J, K, Q, S, X, Z D, T L M, N, Ñ R A, Á, E, É, I, Í, O, Ó, U, Ú, Ü, H, W, Y Otros caracteres especiales también se ignoran, como apóstrofes, guiones, etc. Por ejemplo, el código Soundex para la palabra O’higgins es O252. La letra “O” por la primer letra de la cadena, se ignora el apóstrofe y las letras “H” e “I”, el número 2 por la primera letra “G” (vea las Reglas de codificación más abajo), el número 5 por la letra “N”, y el número 2 por la letra “S”. Reglas de Codificación Las siguientes reglas aplican para la codificación soundex de una cadena de caracteres. 1) Si en una cadena hay una letra doble (por ejemplo “rr” como en “Gutiérrez”, “LL” en “Llavallol”, o “gg” en “O’higgins”) sólo se codifica la primera; la segunda es ignorada. 2) Si en la cadena hay dos letras juntas que tienen el mismo número en la tabla de codificación, se toma la primera y se ignora la segunda. Por ejemplo, la cadena “Jackson” tiene código J250: La primer letra de la palabra “J”, la “a” se ignora, 2 por la “c”, la “k” se ignora porque tiene el mismo número a la “c”, 5 por la “n”, y se agrega un cero (0) para completar los cuatro caracteres. 3) Si una vocal está separando dos consonantes con el mismo código de soundex, se codifica únicamente la consonante a la derecha de la vocal, mientras la de la izquierda se ignora, salvo que sea la primera letra de la cadena. 4) Si una H o W separan a dos consonantes con el mismo código soundex, la consonante de la derecha se ignora. Por ejemplo, la cadena “Ashcraft” tiene código A261 (A por la primera letra de la cadena, 2 por la letra “S”, la h y la c se ignoran, 6 por la letra “R”, y 1 por la letra “F”; el resto de las letras de la cadena no se codifican). Note que estas reglas apuntan a que no existan números iguales contiguos en el código. Por ejemplo, el código R220 es incorrecto ya que no aplica una de estas reglas. 68 Compumap® Geocoding Algunos ejemplos La palabra “CAÑADA” tendrá el mismo código que “CANADA” o “CANIADA”: CAÑADA = C530 CANADA = C530 CANIADA = C530 La palabra “Zufriategui” es diferente a “Sufriategui”, pero su código es muy parecido: Zufriategui = Z163 Sufriategui = S163 La palabra “Houssay” es diferente a “jusei”, pero al igual que el ejemplo anterior, su código numérico es muy parecido: Houssay = H200 Jusei = J200 Función DIFFERENCE() SQL Server tiene una función denominada DIFFERENCE que da un valor de 0 a 4 indicando la cantidad de coincidencias entre 2 códigos soundex. La mayor diferencia es 0 y la mayor coincidencia es 4. Esta función compara dos códigos soundex (por ejemplo, el valor buscado versus el valor almacenado en el campo de la tabla). Resultados de 4 o 3 denotan una alta probabilidad de coincidencia, resultados menores a 3 denotan una probabilidad media, baja o nula de coincidencia. El siguiente ejemplo muestra el pseudocódigo para programar la función Diferencia(): ‘ Funcion DIFERENCIA ‘ Si el resultado es 4 los códigos son iguales, si es 0 son ‘ distintos 69 Compumap® Geocoding FUNCION DIFERENCIA(cadena1, cadena2) ‘ Paso cada carácter de las cadenas a una lista de 4 ‘ elementos Dif = 4 ‘Asume inicialmente coincidencia total SNDXcad1 Lista1 = Lista1 = Lista1 = Lista1 = = Soundex(cadena1) Agregar(IZQ(SNDXcad1,1)) Agregar(MEDIO(SNDXcad1,2,1)) Agregar(MEDIO(SNDXcad1,3,1)) Agregar(DER(SNDXcad1,1)) SNDXcad2 Lista2 = Lista2 = Lista2 = Lista2 = = Soundex(cadena2) Agregar(IZQ(SNDXcad2,1)) Agregar(MEDIO(SNDXcad2,2,1)) Agregar(MEDIO(SNDXcad2,3,1)) Agregar(DER(SNDXcad2,1)) POR CADA i en 1..4 SI (Lista1<>Lista2) ENTONCES Dif = Dif -1 FIN FIN DIFERENCIA = Dif FIN FUNCION Como mencionamos anteriormente, hay que tener en cuenta la cantidad de palabras en las cadenas a comparar. La función DIFERENCIA() sólo evalúa cadenas de una única palabra. Para evaluar cadenas con cantidades variables de palabras, habrá que considerar diversos elementos como la cantidad de palabras en cada cadena, y cómo evaluar el resultado final de la función. Es por esto que pueden darse los siguientes casos: a) La cadena1 tiene igual cantidad de palabras que la cadena2. b) La cadena1 tiene menos palabras que la cadena2. c) La cadena 1 tiene más palabras que la cadena2. Si se da el caso a, y la función DIFERENCIA da como resultado un valor de entre (3 x Cantidad de palabras) y (4 X Cantidad de Palabras) estamos ante una alta probabilidad de 70 Compumap® Geocoding coincidencia. En los casos b y c donde la cantidad de palabras difieren, podemos encontrarnos con ambigüedades. Por ejemplo, supongamos que desea buscar la cadena “Ballester” en la columna Localidad_Postal de la tabla Gcodes mediante su código Soundex: Soundex(“Ballester”) = B423 En la tabla se encuentran 3 registros con igual código soundex de una palabra individual: Villa Ballester = V400 B423 Ballesteros = B423 Ballesteros Sud = B423 S300 En este caso, el usuario deberá elegir la opción correcta de todas las ambigüedades, aunque a priori se podría decir que la que mayor probabilidad de coincidencia corresponda a la cadena Ballesteros, ya que es el único valor que tiene exactamente el mismo código soundex que la cadena buscada. Este mismo ejemplo lo dimos anteriormente, buscando coincidencias entre cadenas con el operador LIKE, y los resultados han sido exactamente iguales a los obtenidos con las funciones SOUNDEX() y DIFERENCIA(). Ahora supongamos que se desea buscar una calle llamada “Almirante Brown”, pero el usuario escribe “Almirante Braun”. En las tablas, la calle se encuentra nomenclada como “Brown Guillermo Alte”. Veamos que pasa al realizar la búsqueda por código soundex: Soundex(“Almirante Braun”) = A456 B650 Brown Guillermo Alte. = B650 G465 A430 Podemos observar en este ejemplo que a pesar que la cadena de búsqueda no coincide en absoluto con el nombre de la calle (ni siquiera haciendo una consulta con el operador LIKE) se ha obtenido un resultado con alta probabilidad de coincidencia. Los códigos resaltados en amarillo son exactamente iguales, mientras los resaltados en color celeste tienen una diferencia de 2. 71 Compumap® Geocoding Consideraciones adicionales antes de implementar códigos soundex La función Soundex() se utiliza principalmente al no obtener resultados en la búsquedas por cadena, ya sea con el operador “=” o el operador “Like”. La comparación por código de soundex es particularmente útil en implementaciones de Call Centers u operadores de servicios de emergencias (911, ambulancias, etc.) donde los domicilios son “escuchados” telefónicamente y sin la posibilidad de leer el domicilio desde el documento u otros elementos donde figure la dirección (por ejemplo, una factura de servicios). Adicionalmente, en los servicios de emergencia donde cada segundo que transcurre puede ser crucial, no se le puede pedir al usuario que deletree el nombre de la calle, o que no hable con voz temblorosa o nerviosa cuando está padeciendo una situación complicada. Existen algunas funciones adicionales que pueden utilizarse para hacer comparaciones de cadenas como levenshtein(), metaphone(), y similar_text() que implementa el lenguaje PHP. No obstante, todas ellas tienen un costo de procesamiento, al igual que Soundex(). Se deja a criterio del implementador de Compumap® Geocoding si desea usar o no esta función, teniendo en cuenta las siguientes consideraciones: a) Si no utiliza SQL Server u otras bases de datos que implementen la función Soundex(), deberá crear tablas adicionales que contengan los códigos soundex de cada palabra en la cadena que desee compararse. b) Deberá tener un proceso que permita actualizar las tablas de códigos soundex cuando se actualicen las tablas de calles, localidades o mapas, o simplemente cuando se agreguen nuevos vuelcos a las tablas de la base. c) Considere utilizar las tablas de sinónimos provistas antes de utilizar la función Soundex(). Esta alternativa puede resultarle más útil y menos costosa. d) Como hemos demostrado, la comparación por códigos Soundex es útil como último recurso cuando el data-entry ingresa el string de búsqueda de forma incorrecta o con errores de ortografía. 72