Archivo del Autor: jomarlla

Acerca de jomarlla

Jose Carlos Martinez has been a professor in the Dept. of Cartographic Engineering, Geodesy and Photogrammetry at the Polytechnic University of Valencia for more than 10 years. He received his M.Sc. degree in Geodesy and Cartography from this University in 1999, and his PhD in GIS (Geographical Information System) and Cartography in 2003. His main research interests include free GIS software, Spatial Databases, 3D Visualization and Photogrammetry. He has collaborated with several companies and research centers, in particular on GIS, interoperability tools and open source projects. He is author of more than 50 papers in journals and international conferences.

Nueva edición del libro de PostGIS (segunda edición, 2018)

libro_postgis_ed2

Os quiero presentar la edición actualizada (segunda edición) publicada hoy mismo del libro de «PostGIS: Análisis Espacial Avanzado«.

Más información aquí

Aproximadamente un 20% del libro es material nuevo (572 páginas), y un 30-40% son modificaciones, actualizaciones y pequeñas mejoras debido a las nuevas versiones de PostgreSQL/PostGIS utilizadas, así como a diferentes correcciones y/o ampliaciones realizadas.

Si ya dispones de la primera edición del libro te apunto las novedades principales para valorar si necesitas adquirir esta nueva edición:

  • Análisis espacial 3D con SFCGAL.
  • Tratamietno de geometrías superficiales.
  • Ampliación de geometrías curvas.
  • Subcontulas correladas y laterales espaciales.
  • Consultas espaciales paralelas.
  • Herencias de tablas y particiones. Particiones declarativas.
  • Índices KNN (subconsultas correladas), BRIN.
  • Actualizaciones de pgrouting y pgversion, y algebra de mapas ráster.
  • Definiciones algebraicas de las reglas de topología.
  • Actualizaciones debido a las nuevas versiones de PostgreSQL/PostGIS.

 

 

Cómo convertir en PostGIS líneas no simples a simples (How to convert non-simple to simple lines in PostGIS)

Las líneas no simples son aquellas que pasan por un mismo punto dos veces, es decir, se autointersecan.

A los que trabajamos con cartografía esto no nos gusta nada, ya que puede originar comportamientos no deseados en análisis espaciales futuros.

PostGIS con ST_IsSimple permite saber si una línea contiene autointersecciones pero no permite eliminarlas.

El comando ST_Node calcula nuevas intersecciones convirtiendo una linestring en una multilinestring con 3 subelementos (en el ejemplo inferior), pero !sorpresa! esa nueva multilinestring sigue siendo no simple (* razón en la figura).

La sencilla función STX_NodeSimple que hemos desarrollado en plpgsql partirá dicho elemento cerrado de forma que la multilinestring resultante sea simple.

Non-simple lines are those that pass through the same point twice, that is, they are self-intersecting.

Those of us who work with cartography do not like this at all, since it can cause unwanted behavior in future spatial analysis.

PostGIS with ST_Issimple allows to know if a line contains self-intersections but does not allow to eliminate them.

The ST_Node command calculates new intersections by converting a linestring into a multilinestring with 3 subelements (in the example), but what a surprise to know that the new multilinestring is still not simple (* reason).

The STX_NodeSimple  in plpgsql will split said closed element so that the resulting multilinestring is simple.

nodesimple_code1

nodeexample

s1=# select st_astext(geom), st_issimple(geom),       st_numgeometries(geom),st_length(geom) from
(select st_node ('LINESTRING (6 3, 15 12, 26 16, 36 17, 26 7, 19 18, 22 22)'::geometry)) as foo(geom);

-[ RECORD 1 ]----+-------------------------------------------------------
st_astext | MULTILINESTRING((6 3,15 12,21.3489932885906 14.3087248322148),(21.3489932885906 14.3087248322148,26 16,36 17,26 7,21.3489932885906 14.3087248322148),(21.3489932885906 14.3087248322148,19 18,22 22))
st_issimple | f
st_numgeometries | 3
st_length | 66.6630380273346

s1=# select st_astext(geom), st_issimple(geom), st_numgeometries(geom),st_length(geom) from
(select stx_nodesimple ('LINESTRING (6 3, 15 12, 26 16, 36 17, 26 7, 19 18, 22 22)'::geometry)) as foo(geom);

-[ RECORD 1 ]----+-------------------------------------------------------
st_astext | MULTILINESTRING((6 3,15 12,21.3489932885906 14.3087248322148),(21.3489932885906 14.3087248322148,26 16),(26 16,36 17,26 7,21.3489932885906 14.3087248322148),(21.3489932885906 14.3087248322148,19 18,22 22))
st_issimple | t
st_numgeometries | 4
st_length | 66.6630380273346