miércoles, 15 de abril de 2015

Extraer los vértices de un Polígono en Postgresql / Postgis

En esta oportunidad, se presentara dos consultas SQL para Postgresql / Postgis para extraer los vértices o puntos de un Polígono. Con ello obtendremos los componentes X, Y, Z y M (para los casos de POLYGON, POLYGONM, MULTIPOLYGON, MULTIPOLYGONM). Para ello usaremos la función ST_DumpPoints.
Función ST_DumpPoints: en términos simples, esta función devuelve los vértices o puntos que está formado una geometría. El resultado que devuelve está compuesto por dos componentes (*):
Path: que es la ubicación del vértice o punto obtenido. De tipo Array de enteros.
Geom: que es el punto mismo. De tipo Geometry.
(*) Esta terminología es obtenida de la ayuda del Postgis
Ejemplo polígono:

 
Select st_DumpPoints(the_geom) From TablaPoligono


Resultado: “{1,1,1}”,0100001111111
Dónde:
{1,1,1}: Es un array de enteros que indica que este punto está en el Polígono 1, Parte 1, vértice 1
0100001111111: es el punto en formato binario

Ejemplo de Aplicación:

Para el caso de los polígonos, teniendo una tabla como la obtenida de esta consulta SQL:


Create Table poligonomz (gid serial NOT NULL,
    nombpol varchar(10),
    CONSTRAINT poligonomz_pkey PRIMARY KEY (gid));
Select addGeometryColumn('poligonomz', 'the_geom', -1, 'MULTIPOLYGON', 4);
Insert Into poligonomz (nombpol, the_geom) Values ('pol-1', GeomFromText('MULTIPOLYGON(((511994.025 8319496.485 10 -10, 511994.172 8319496.513 20 -20, 511994.181 8319496.421 30 -30, 511994.050 8319496.403 40 -40, 511994.025 8319496.485 10 -10)))'));
Insert Into poligonomz (nombpol, the_geom) Values ('pol-2', GeomFromText('MULTIPOLYGON(((511993.862 8319496.494 100 -100, 511993.926 8319496.490 200 -200, 511993.926 8319496.407 300 -300, 511993.860 8319496.406 400 -400, 511993.862 8319496.494 100 -100 ),(511993.756 8319496.364 110 -110, 511993.846 8319496.370 220 -220, 511993.845 8319496.295 330 -330, 511993.757 8319496.286 440 -440, 511993.756 8319496.364 110 -110 ) ))'));
Insert Into poligonomz (nombpol, the_geom) Values ('pol-3', GeomFromText('MULTIPOLYGON(((511994.062 8319496.359 1000 -1000, 511994.073 8319496.295 2000 -2000, 511993.944 8319496.282 3000 -3000, 511993.966 8319496.351 4000 -4000, 511994.062 8319496.359 1000 -1000),(511993.981 8319496.328 1100 -1100, 511993.984 8319496.303 2200 -2200, 511994.042 8319496.306 3300 -3300, 511994.045 8319496.338 4400 -4400, 511993.981 8319496.328 1100 -1100 ) ))'));


Y si lo vemos en el QGIS, tenemos lo siguiente

















La consulta es que extrae los Puntos, el componente Z y M es:

select  nombpol,
        GeometryType(the_geom),  
        st_dumppoints(the_geom),
       (st_dumppoints(the_geom)).path,
       (st_dumppoints(the_geom)).path[1],
       (st_dumppoints(the_geom)).path[2],
       (st_dumppoints(the_geom)).path[3],
       st_astext((st_dumppoints(the_geom)).geom),
       st_z((st_dumppoints(the_geom)).geom),
       st_m((st_dumppoints(the_geom)).geom)
 from poligonomz 


Dónde:
nombpol: nombre del polígono (viene de la consulta de creación de los polígonos).
GeometryType(the_geom): obtengo el tipo de geometría que está en la columna the_geom.
st_dumppoints(the_geom): la función ST_DumpPoints aplicada a la columna the_geom.
(st_dumppoints(the_geom)).path: obtenemos la componente Path de ST_DumpPoints
(st_dumppoints(the_geom)).path[1], [2] y [3]: obtenemos los elementos del Path obtenido.
st_astext((st_dumppoints(the_geom)).geom): obtenemos el componente Geom de ST_DumpPoints y lo pasamos por la function ST_AsText para ver las coordenadas.
st_z((st_dumppoints(the_geom)).geom) obtenemos el Z de los vértices del polígono.
st_m((st_dumppoints(the_geom)).geom) obtenemos el M de los vértices del polígono.


El resultado es como sigue:

















Esperando que sea de su ayuda, será hasta el otro mes.
ª