Compumap® Geocoding

Anuncio
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
Descargar