Vinko, por que empezaste a usar PostgreSQL ?
Empecé a usar PostgreSQL porque necesitaba de bases de datos 'espaciales'.
Previamente había utilizado Oracle, MSSQL y MySQL, la primera y
la segunda por obligación, la tercera simplemente por ser la más
conocida en esa época.
Ahora que ya llevo un tiempo usando PostgreSQL, me costaría dejar
de usarla
Que resultado te ha dado su uso ?
Satisfactorio hasta el momento.
Lo único que ha sido un poco molesto es la migración de
bases de datos entre versiones, que es levemente engorrosa.
Recomendarias el uso de PostgreSQL a otros programadores ?
Claro que sí.
Su flexibilidad, relativa facilidad de uso (la mantención es un
poco más complicada), excelente documentación y robustez
la hacen una buena elección en múltiples escenarios, y eso
sin siquiera entrar en temas filosóficos y enunciar los beneficios
que tiene que sea Open Source.
Sabemos que trabajas con PostGIS.
Podrias explicarnos que es precisamente PostGIS y de que forma potencia
a PostgreSQL?
La forma tradicional de almacenar información espacial Digitalmente
es utilizar algún formato de los programas SIG 'de escritorio'
como ArcView, MapInfo o GRASS.
En general estos formatos son poco flexibles y bastante anticuados, típicamente
son un conjunto de archivos que almacenan la información sobre
las coordenadas, proyección espacial y los datos asociados a cada
elemento.
El formato más común utiliza archivos DBF para almacenar
los datos, el que presenta muchas limitaciones que parecen totalmente
arbitrarias en el día de hoy como por ejemplo nombres de campos
limitados a 10 caracteres, 3 ó 4 tipos de
datos, entre otras.
En cambio, PostGIS (y en general cualquier extensión espacial a
un RDBMS) soluciona estos problemas y además, permite una mucho
mayor flexibilidad porque hace posible realizar operaciones espaciales
en la fuente de datos misma, lo que trae varias ventajas, entre ellas:
- Alivia la vida del programador, puesto que evita el tener que implementar
esas operaciones en la aplicación (intersección, búsqueda
por cajas, proyección geografica de los datos, etc.).
Ademas se puede optar por desarrollar partes de la lógica de la
aplicación vía procedimientos almacenados, o generar nuevos
conjuntos de datos a partir de los existentes de manera mucho mas fácil
a través de vistas, subselects, joins o
tablas temporales.
- Permite un mayor control sobre la aplicación, al separar los
datos del lugar donde se encuentra la aplicación (y no tener necesariamente
que compartir archivos vía un sistema de archivos distribuido si
queremos separar los datos de la aplicación).
Este control presenta beneficios en varios niveles, como el de poder distribuir
la carga hacia el RDBMS, o a la aplicación, según el tipo
de aplicación y sus características, o correr en máquinas
distintas el servidor espacial (de haberlo) y el
RDBMS.
PostGIS es simplemente una extensión a PostgreSQL, que define
nuevos tipos de datos, crea dos tablas con información relevante
al sistema (proyección de los datos y columna que posee la información
geográfica) y define también las funciones de manejo de
información como procedimientos almacenados.
Además trae interfaces para servir de fuente de datos a MapServer,
y a herramientas que utilizan OGR
(http://gdal.velocet.ca/projects/opengis/),
cuyo soporte está en alpha en estos momentos.
PostgreSQL + PostGis podria llegar a competir con sistemas como Oracle
Spatial Extension?
No he tenido la oportunidad de usar Oracle Spatial ni ArcSDE, pero según
los planes de desarrollo, para la versión 1.0 debiera ser más
o menos equivalente en capacidades a las alternativas comerciales.
Además de implementar la "Simple Features Specification for
SQL"
(http://www.opengis.org/techno/specs/99-049.pdf)
de manera completa al llegar a 1.0, se va a tener un conjunto relativamente
grande de interfaces para la interacción con PostGIS.
Sin embargo, con la funcionalidad del día de hoy (0.7.3), para
las aplicaciones que me ha tocado desarrollar, basta y sobra.
Cual es el visualizador (viewer) que graficamente despliega la informacion
espacial, o cual sugieres ?
En estos momentos la única interfaz que funciona sin problemas
es la interfaz hacia MapServer, que está diseñado para presentar
la información espacial vía WWW.
Sin embargo, hay varias otras interfaces que con un poco más de
trabajo pueden hacerse funcionar y, por último, siempre puedes
implementar tu propia interfaz hacia el programa que quieras, usando libpq.
Dependiendo del programa, esto puede ser desde algo trivial hasta algo
super complicado.
(continua en la columna der.)
|
(viene de la columna izq.)
Cuales son los pasos para dejar operativo a PostgreSQL con PostGis
? (a "Grosso Modo")
Instalar PostgreSQL, si se instala desde paquetes, instalar el paquete
devel.
Luego copiar PostGIS al directorio contrib, correr make y luego correr
unos scripts SQL en la base de datos que se va a usar, que generan los
tipos de datos y las tablas necesarias para su funcionamiento.
Luego se deben poblar las tablas, hay utilidades para importar y exportar
del formato más común, y también hay procedimientos
que permiten el ingreso 'manual' de datos; si son muchos se debe hacer
un script "ad hoc".
Tienes algunas lineas de codigo de PostgreSQL y PostGIS, a
modo de ejemplo ?
Este ejemplo es un query generado automáticamente por una de
las aplicaciones que estoy desarrollando, que genera una clasificación
dinámica de las comunas de una región basado en un valor
arbitrario, en este caso, por la suma de la población de Aymaras,
Rapa Nui y Mapuche en la segunda región.
Esto me permite pintar de distintos colores las distintas comunas según
un cierto criterio, como la cantidad de población, o el número
de camas por habitante, o el índice de criminalidad, etc.
A Mapserver le digo simplemente que pinte de color X las comunas que
tengan valor 0 en la columna MYEXP, de color Y las que tengan valor 1
en MYEXP, etc.
Esto, sin PostGIS, significaría acceder a la base de datos con
datos de población, abrir el archivo de datos, leerlo registro
por registro, compararlo con los datos traídos de la base y generar
otro archivo con los datos para la clasificación y luego desplegar
ese archivo
select the_geom from
(select map.the_geom, map.nombre, map.oid , case
when data.value >= 14 and data.value <= 14 then '0'
when data.value >= 45 and data.value <= 45 then '1'
when data.value >= 78 and data.value <= 78 then '2'
when data.value >= 283 and data.value <= 283 then '3'
when data.value >= 303 and data.value <= 303 then '4'
when data.value >= 464 and data.value <= 464 then '5'
when data.value >= 785 and data.value <= 785 then '6'
when data.value >= 4630 and data.value <= 4630 then '7'
when data.value >= 10032 and data.value <= 10032 then '8'
else 'resto' end as MYEXP from chile_poly as map,
data_temp as data
where map.cod_ine = data.cod_ine) as expqry
El siguiente ejemplo es un ejemplo de uso de las funciones espaciales
en sentencias SQL, también generado de manera automática:
SELECT c.region, c.provincia, c.comuna, d.value as atributo
FROM chile_poly c, data_temp d
WHERE c.cod_ine = d.cod_ine
AND
GeometryFromText('BOX3D(294290.4863388 6265788.7355191, 294290.4863388
6265788.7355191)::box3d',-1) && the_geom
AND
truly_inside(the_geom,'BOX3D(294290.4863388 6265788.7355191,
294290.4863388 6265788.7355191)::box3d')
Aquí vemos el uso de dos funciones y un operador PostGIS.
La función GeometryFromText genera un 'string espacial' a partir
de las coordenadas y el tipo de datos que recibe, en este caso es una
caja (que en realidad representa un punto) elegida por el usuario, luego
eso se compara con la columna de datos espaciales the_geom mediante el
operador &&, que determina si la caja que contiene a A (GeometryFromText(...))
se intersecta en algún punto con la que contiene a B (the_geom).
Luego necesitamos determinar si la caja seleccionada por el usuario está
realmente dentro del objeto geométrico, para esto se usa la función
truly_inside(), que compara vértice con vértice y no solo
las cajas que contienen al objeto.
Si se fijan, bastaría sólo con utilizar truly_inside() pero
debido a razones de rendimiento, es aconsejable primero acotar el espacio
de búsqueda mediante los operadores que trabajen sobre las cajas
que contienen a los objetos, como &&, ya que ese tipo de operaciones
aprovechan los índices, para luego comparar vértice a vértice
la menor cantidad de datos posible.
Este query obtiene los datos que existen en la base asociados a un cierto
objeto seleccionado por el usuario, que, en el caso presentado, son la
región, provincia, comuna y el valor arbitrario que se usa en el
primer query que muestro.
Que sitios visitas habitualmente para apoyar tu labor de desarrollo
?
Principalmente obtengo información de las listas de correo relevantes
(mapserver-users, postgis-users, etc).
Además uso los manuales de www.postgresql.org/idocs
y, por supuesto, Google.
Que otras bases de datos manejas y como puedes compararlas con PostgreSQL
?
Manejé un tiempo Oracle y después de conocer Postgres
me parece que trae demasiadas complicaciones innecesarias para gran parte
de los casos, partiendo por el parto que es la instalación en Linux.
He usado MySQL y también MS Sql Server.
MS Sql Server y su política de la 'lotería de la muerte'
lo hace bastante desagradable para el programador o el usuario final.
A MySQL aun le falta mucho.
En resumen, PostgreSQL la lleva :-)
Algo mas que quisieras agregar ?
Si algo no quedó claro, o están interesados en conocer
más sobre SIG y sus aplicaciones, no duden en contactarme.
Gracias por el espacio.
Gracias a ti,Vinko.
Vinko Vrsalovic
Se desempeña en el Centro
de Estudios en Percepción Remota y SIG, realizando labores de
administración de sistemas y desarrollo de aplicaciones relacionadas
con el manejo de información espacial, para clientes del área
gubernamental y empresas privadas.
Ademas cursa el Magister en Ciencias de Ingeniería en la Pontificia
Universidad Católica, en la ciudad de Santiago de Chile. |