Compumap Geocoding - compumaphome.com · utilizan las entrecalles para asegurarse el punto preciso...

72
Compumap® Geocoding Manual del Usuario

Transcript of Compumap Geocoding - compumaphome.com · utilizan las entrecalles para asegurarse el punto preciso...

Compumap®

Geocoding

Manual del Usuario

Compumap® Geocoding

2

Í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

Compumap® Geocoding

3

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

Compumap® Geocoding

4

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

Compumap® Geocoding

5

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.

Compumap® Geocoding

6

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.

Compumap® Geocoding

7

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

Compumap® Geocoding

8

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:

Compumap® Geocoding

9

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

Compumap® Geocoding

10

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 CALLE CALLE1 CALLE2 ALTURA

x x x

x x x

x x x 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

Compumap® Geocoding

11

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

Compumap® Geocoding

12

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

Compumap® Geocoding

13

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) Región del Norte Grande Argentino

b) Región del Nuevo Cuyo

c) Región Patagónica

d) 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í.

Compumap® Geocoding

14

Compumap® Geocoding

15

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.

Compumap® Geocoding

16

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

Compumap® Geocoding

17

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.

Compumap® Geocoding

18

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.

Compumap® Geocoding

19

Tabla: CP_CABA

CAMPO TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Nombre_Calle_Postal Varchar(50) 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.

Alt_desde Integer Altura inicial desde la cual se aplica el código postal. Si es cero toda la calle tiene el mismo código postal.

Alt_hasta Integer Altura final hasta la cual se aplica el código postal. Si es cero toda la calle tiene el mismo código postal.

Codigo_Postal Integer Código postal de 4 dígitos.

Id_Calle_Mapa Integer FK 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

Compumap® Geocoding

20

CONSTRAINTS en una sentencia ALTER TABLE, quitándolos previamente de la sentencia

CREATE.

Tabla: Calles

CAMPO TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Id_Calle Integer Id de calle dentro del mapa.

Id_Mapa Integer FK Id de mapa. FK de la tabla Mapas

Nombre_Calle Varchar(50) Nombre de la calle.

Id_Tipo Integer FK Indica el ID de tipo de calle (Avenida, ruta, etc.) FK de tabla TipoCalle

Alt_desde Integer Altura inicial desde el inicio de la calle.

Alt_hasta Integer 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),

Compumap® Geocoding

21

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 TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Localidad_Postal Varchar(60) Nombre de la localidad en la guía de códigos postales.

Id_Prov Integer FK Id de provincia. FK de la tabla Provincia

Id_PdoDto Integer ID de Partido o Departamento de los mapas base de Compumap.

PdoDto Varchar(60) Nombre del partido o departamento.

CPostal Integer Código Postal de la localidad.

Id_Mapa Integer FK 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.

NombreMapa Varchar(60) Nombre del mapa al que corresponde la localidad. Los nombres existen aunque el mapa no esté disponible.

Latitud Latitud en formato GG.DDDDDD (*)

Longitud 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

Compumap® Geocoding

22

partidos del Gran Buenos Aires, y en ciertos casos el mapa puede contener ambas capas

(localidades y barrios) que por lo general se solapan.

Compumap® Geocoding

23

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 TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Id_Localidad Integer Nombre de la localidad en la guía de códigos postales.

Id_Mapa Integer FK 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 Varchar(45) 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

Compumap® Geocoding

24

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 TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Lugar Varchar(50) Nombre del lugar.

Latitud Integer FK Latitud en formato GG.DDDDDD

Longitud Varchar(45) Longitud en formato GG.DDDDDD

Id_Mapa Integer FK Id de mapa. FK de la tabla Mapas

Id_Calle Integer FK Id de calle en el mapa. FK de la tabla Calles.

Id_Calle1 Integer FK Id de calle1 en el mapa. FK de la tabla Calles.

Id_Calle2 Integer FK Id de calle2 en el mapa. FK de la tabla Calles.

Altura Integer Altura

Compumap® Geocoding

25

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 TIPO KEY NULL DESCRIPCION

Id_mapa Integer PK NOT NULL Id de Mapa.

Nombre Varchar(50) Nombre de mapa.

Id_prov Integer FK 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.

Compumap® Geocoding

26

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 TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Id_Prov Integer Id de provincia en mapas Compumap.

Provincia Varchar(40) Nombre de la provincia.

Segmentos

La tabla Segmentos tiene información detallada de cada cuadra de una calle. La

información que puede obtener de esta tabla se describe en la lista siguiente:

a) A qué calle pertenece el segmento.

b) A qué mapa pertenece la calle.

c) La altura inicial y final del segmento.

d) Coordenadas geográficas (latitud y longitud) del punto medio del segmento.

e) Localidad o barrio del mapa al que pertenece el segmento.

f) Vértice inicial y final del segmento. Permite conocer las calles o segmentos que

cruzan al segmento, en ambos vértices.

Compumap® Geocoding

27

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 TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Id_mapa Integer FK Id del mapa al que pertence el segmento. FK de la tabla Mapas.

Id_Calle Integer FK Id de calle en el mapa. FK de la tabla Calles.

Alt_desde Integer Altura inicial del segmento (*)

Alt_hasta Integer Altura final del segmento (*)

PM_lat Numeric Latitud en formato GG.DDDDDD del punto medio del segmento.

PM_lon Numeric Longitud en formato GG.DDDDDD del punto medio del segmento.

Id_localidad Integer FK Id de localidad o barrio al que pertenece el segmento. FK de la tabla Localidad

Id_vertini Integer Id del vértice inicial.

Id_vertfin Integer Id del vértice final.

(*) Si la altura en Alt_desde y Alt_hasta es 0 (cero), el segmento no tiene altura.

Compumap® Geocoding

28

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 TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Id_mapa Integer FK Id del mapa al que pertence la calle para la cual se define el sinónimo. FK de la tabla Mapas.

Id_Calle Integer FK Id de calle al que se refiere el sinónimo. FK de la tabla Calles.

Sinonimo Varchar(50) Nombre del sinónimo.

Compumap® Geocoding

29

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 TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Id_mapa Integer FK Id del mapa al que pertenece la localidad para la cual se define el sinónimo. FK de la tabla Mapas.

Id_Locali Integer FK Id de localidad al que se refiere el sinónimo. FK de la tabla Localidad.

Sinonimo Varchar(50) Nombre del sinónimo.

Compumap® Geocoding

30

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 TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Id_mapa Integer FK Id del mapa para la cual se define el sinónimo. FK de la tabla Mapas.

Sinonimo Varchar(50) Nombre del sinónimo.

Compumap® Geocoding

31

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 TIPO KEY NULL DESCRIPCION

Id Integer PK NOT NULL Id de registro, autoincremental.

Id_Prov Integer FK Id de la provincia para la cual se define el sinónimo. FK de la tabla Provincia.

Sinonimo Varchar(50) Nombre del sinónimo.

Compumap® Geocoding

32

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 TIPO KEY NULL DESCRIPCION

Id_tipo Integer PK NOT NULL Id de tipo.

Tipo Varchar(40) Descripción del tipo.

Compumap® Geocoding

33

Modelo Relacional

Compumap® Geocoding

34

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:

Compumap® Geocoding

35

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

Compumap® Geocoding

36

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

Compumap® Geocoding

37

‘[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.

Compumap® Geocoding

38

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.

Compumap® Geocoding

39

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

Compumap® Geocoding

40

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

Compumap® Geocoding

41

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.

Compumap® Geocoding

42

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'

Compumap® Geocoding

43

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.

Compumap® Geocoding

44

Compumap® Geocoding

45

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'

Compumap® Geocoding

46

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 Id_Verfin

2718 11439

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.

Compumap® Geocoding

47

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:

Compumap® Geocoding

48

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

Compumap® Geocoding

49

‘ 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 = [Cruces Calle1].Id_vertini

OR [Cruces Calle].Id_Vertfin = [Cruces Calle1].Id_vertfin

OR [Cruces Calle].Id_Vertini = [Cruces Calle1].Id_vertfin

OR [Cruces Calle].Id_Vertfin = [Cruces 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'

Compumap® Geocoding

50

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.

Compumap® Geocoding

51

SELECT DISTINCT ID_Calle

FROM Segmentos

WHERE Id_mapa = '19'

AND (ID_Vertini = '653' OR Id_vertfin = '653')

AND ID_Calle <> '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 ID_Calle

FROM Segmentos

WHERE Id_mapa = '19'

AND (ID_Vertini = '652' OR Id_vertfin = '652')

AND ID_Calle <> '128'

Resultado:

ID_Calle = 87

Compumap® Geocoding

52

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 ID_Calle

FROM Segmentos

WHERE Id_mapa = '19'

AND (ID_Vertini = '652' OR Id_vertfin = '652')

AND ID_Calle <> '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:

Compumap® Geocoding

53

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) Sinónimos de Provincias

2) Sinónimos de Mapas

3) Sinónimos de Localidades

4) 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.

Compumap® Geocoding

54

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:

Compumap® Geocoding

55

select ID_calle, Nombre_Calle

from Calles

where Nombre_Calle LIKE '%colect%' AND ID_Mapa = '19'

Resultado:

ID_Calle Nombre_Calle

493 S Colectora Norte O

492 E Colectora Norte N

435 Colectora Acceso Oeste (Norte)

437 Colectora Acceso Oeste (Sur)

487 E Colectora Sur N

488 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().

Compumap® Geocoding

56

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”:

Compumap® Geocoding

57

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.

Compumap® Geocoding

58

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.

Compumap® Geocoding

59

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.

Compumap® Geocoding

60

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.

Compumap® Geocoding

61

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.

Compumap® Geocoding

62

5) Abra el archivo CSV que acaba de exportar, y obtenga los datos necesarios para

generar la dirección del lugar:

Compumap® Geocoding

63

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:

Compumap® Geocoding

64

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

Compumap® Geocoding

65

Compumap® Geocoding

66

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.

Compumap® Geocoding

67

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.

Compumap® Geocoding

68

La siguiente tabla define los números que representan a cada una de las letras:

Número Letras que representa

1 B, F, P, V

2 C, G, J, K, Q, S, X, Z

3 D, T

4 L

5 M, N, Ñ

6 R

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

Compumap® Geocoding

69

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

Compumap® Geocoding

70

FUNCION DIFERENCIA(cadena1, cadena2)

‘ Paso cada carácter de las cadenas a una lista de 4

‘ elementos

Dif = 4 ‘Asume inicialmente coincidencia total

SNDXcad1 = Soundex(cadena1)

Lista1 = Agregar(IZQ(SNDXcad1,1))

Lista1 = Agregar(MEDIO(SNDXcad1,2,1))

Lista1 = Agregar(MEDIO(SNDXcad1,3,1))

Lista1 = Agregar(DER(SNDXcad1,1))

SNDXcad2 = Soundex(cadena2)

Lista2 = Agregar(IZQ(SNDXcad2,1))

Lista2 = Agregar(MEDIO(SNDXcad2,2,1))

Lista2 = Agregar(MEDIO(SNDXcad2,3,1))

Lista2 = 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

Compumap® Geocoding

71

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.

Compumap® Geocoding

72

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.