Me acuerdo ya más de 10 años atrás, jure y perjure que no iba a involucrarme en un proyecto que tenga que ver con nada referente a GIS, y bueno las vueltas de la vida hacen que de nuevo regrese por estos lares, pero sinceramente en esta década tenemos mejores herramientas para poder lidiar con las operaciones complejas referente a tratamiento de este tipo de datos.
La verdad es que me encontré a un PostGIS (una extensión de Postgres) mucho más maduro y rápido, de verdad me sorprende la manera en la cual puede indexar datos geográficos y espaciales dándote el poder de tener consultas más rápidas, ahora veremos como instalar esta extensión en nuestro Centos 7 x64.
Como primer paso realizamos la actualización de nuestro sistema operativo
#Mantenemos Actualizado nuestro Centos y instalamos unas herramientas necesarias yum update -y yum install open-vm-tools yum install net-tools yum install gzip yum install lbzip* yum install bz* yum install sqlite* yum install vim yum install libxml* #Desactivamos el SELinux vi /etc/sysconfig/selinux #Por defecto centos7 viene con el pgsql 9.1, pero un requerimiento del postgis 2.5 es una versión arriba de la 9.4, asi que agregamos el repositorio y lo instalamos rpm -Uvh http://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/pgdg-redhat96-9.6-3.noarch.rpm yum install postgresql96* #arrancamos el motor de la Base de datos, y hacemos que el servicio arranque desde que se prenda el equipo /usr/pgsql-9.6/bin/postgresql96-setup initdb systemctl enable postgresql-9.6 systemctl start postgresql-9.6 #Habilitamos el acceso de la red con estos ficheros vim /var/lib/pgsql/9.6/data/pg_hba.conf vim /var/lib/pgsql/9.6/data/postgresql.conf systemctl restart postgresql-9.6 #Comenzamos la instalación de las dependencias, esto si lo tenemos que bajar y compilar wget http://download.osgeo.org/geos/geos-3.7.1.tar.bz2 tar -xvf geos-3.7.1.tar.bz2 cd geos-3.7.1 ./configure make make install wget http://download.osgeo.org/proj/proj-6.0.0.tar.gz tar -xvf proj-6.0.0.tar.gz cd proj-6.0.0 ./configure make install wget http://download.osgeo.org/gdal/2.4.0/gdal-2.4.0.tar.gz tar -xvf gdal-2.4.0.tar.gz cd gdal-2.4.0 ./configure make make install #Y por fin bajamos y compilamos el postgis wget http://download.osgeo.org/postgis/source/postgis-2.5.2.tar.gz tar -xvf postgis-2.5.2.tar.gz cd postgis-2.5.2 ./configure --with-pgconfig=/usr/pgsql-9.6/bin/pg_config --with-geosconfig=/usr/local/bin/geos-config --with-gdalconfig=/usr/local/bin/gdal-config make make install make comments make cheatsheets #Compilamos e Instalamos las extensiones en si cd extensions/ cd postgis make clean make make install cd .. cd postgis_topology make clean make make install cd .. cd postgis_sfcgal make clean make make install cd .. cd address_standardizer make clean make make install make installcheck cd .. cd postgis_tiger_geocoder make clean make make install make installcheck #Agregamos /usr/local/lib vim /etc/ld.so.conf.d/local-libs.conf ldconfig -v #Reiniciamos nuestro Postgres systemctl restart postgresql-9.6 #Ahora, ingresamos a la carpeta para poder asignar las extensiones a nuestra base de datos cd /usr/pgsql-9.6/share/contrib/postgis-2.5/ #Ingresamos a nuestro Cli de Postgres \i postgis.sql \i spatial_ref_sys.sql \i postgis_comments.sql \i rtpostgis.sql \i raster_comments.sql \i topology.sql \i topology_comments.sql \i topology.sql \i legacy.sql #Bueno es no nos sirve mucho en perú pero para fines didáctico también podemos agregar las extensiones de esta manera: CREATE EXTENSION address_standardizer;
Bueno aca unas pequeñas ayudas de funciones varias para que arranques
#Base de datos de ejemplo select * from catastro limit 2; id_catastro | cenx | ceny | wgs84_geom ------------------+-----------------+------------------+---------------------------------------------------- 4010412710000900 | 224214.07665000 | 8192649.31640000 | 0101000020E6100000217E306632E551C03CBC9D3ADC5430C0 4010412710000300 | 224227.18729500 | 8192664.41816000 | 0101000020E6100000ACCD615C30E551C0E737AD63D35430C0 (2 rows) #Partiendo de las coordenadas UTM X y Y guardamos generamos un punto y lo transformamos en otro formato, update catastro set wgs84_geom = ST_Transform(ST_SetSRID(ST_MakePoint(cenx,ceny),32719),4326)::geography; UPDATE 262221 #Nos devuelve todos los puntos a menos de 20 metros select * from catastro where ST_Distance(wgs84_geom ,(select wgs84_geom from catastro where id_catastro = 04010304137001400)) < 20; id_catastro | cenx | ceny | wgs84_geom ------------------+-----------------+------------------+---------------------------------------------------- 4010304137002000 | 227929.26990200 | 8186541.90466000 | 0101000020E61000003FD846D404E351C0706C21AC166330C0 4010304137001300 | 227947.54300100 | 8186567.26485000 | 0101000020E6100000BFFBC1FA01E351C06F7C62CC076330C0 4010304137001400 | 227945.72551000 | 8186551.71590000 | 0101000020E61000002285BB4902E351C030E8DAFC106330C0 4010304137001500 | 227944.73510400 | 8186536.09405000 | 0101000020E610000023ED497802E351C07195F1391A6330C0 4010304137002100 | 227927.13768000 | 8186552.94378000 | 0101000020E6100000E7FE812205E351C012EA761F106330C0 4010304137002101 | 227927.87935900 | 8186548.45465000 | 0101000020E6100000F18A9D0705E351C08B9E0DC9126330C0 (6 rows) #Simplemente nos devuelve en lat lot la información contenida en la columna wgs84_geom select *,ST_AsText(wgs84_geom) from catastro where id_catastro = 04010304137001400; id_catastro | cenx | ceny | wgs84_geom | st_astext ------------------+-----------------+------------------+----------------------------------------------------+-------------------------------------------- 4010304137001400 | 227945.72551000 | 8186551.71590000 | 0101000020E61000002285BB4902E351C030E8DAFC106330C0 | POINT(-71.5470146495104 -16.3869779619637) (1 row)
Anotaciones varias:
En si el PostGIS agrega otros tipos de datos como el geography y geometry, pero siempre hay que tener en cuenta el SRID de los datos, en mi caso me dieron una base de datos WSG84 UTM 19S (SIRD 32719) , y la tuve que convertir en WSG84 (SIRD 4326) para poder generar las operaciones.