Más

PostGIS 2.0 y funciones de intersección automática

PostGIS 2.0 y funciones de intersección automática


Tengo una clase de entidad poligonal creada por OpenStreetMap que devuelve un error de autointersección. ¿Hay alguna forma de filtrar estas características? ¿Puedo usar una declaración SQL para encontrar los polígonos de error?


Consulta para

ST_IsValid ([su geometría]) = 'f'

Las auto-intersecciones no son tan maliciosas como las intersecciones sin nudos. Aquí hay algunas soluciones 4 U:

Correcciones automáticas de ST_MakeValid:

actualizar mytable set way = ST_Makevalid (way) donde st_isvalid (way) = false

Y similar, pero usando st_buffer:

actualizar mytable set way = ST_Buffer (way, 0) donde st_isvalid (way) = false

Si no ayuda, esto le dará las coordenadas donde ocurren las intersecciones:

seleccione abs (a1.osm_id) como OSM_ID, motivo (ST_IsValidDetail (a1.way)) como motivo, ST_asText (ST_TRANSFORM (ST_SetSRID (ubicación (ST_IsValidDetail (a1.way)), 900913), 4326)) como ubicación del planeta_osm donde st_isvalid (a1.way) = falso

Puede cargarlo en QGIS como capa de consulta usando esta consulta:

seleccione row_number () over () como GID, location (ST_IsValidDetail (a1.way) como forma de planet_osm_polygon a1 donde st_isvalid (a1.way) = false

Si está utilizando el esquema osm2pgsql y desea repararlo en el proyecto OSM, puede ejecutar esta consulta y guardar el resultado como un archivo XML. Si lo abre con su navegador, puede ver estas intersecciones en OSM o cargarlas en JOSM para repararlas (la consulta no se ha probado, por lo que podría necesitar algunos ajustes):

seleccione abs (a1.osm_id) como OSM_ID, motivo (ST_IsValidDetail (a1.way)) como motivo, ST_asText (ST_TRANSFORM (ST_SetSRID (ubicación (ST_IsValidDetail (a1.way)), 900913), 4326)) como ubicación, a1.tags -> 'osm_user' :: texto como USUARIO, 'Editar en JOSM'como josm,'Editar en JOSM'como Area_in_JOSM,'Mostrar en el mapa'como OSM de planet_osm_polygon a1 donde st_isvalid (a1.way) = orden falso por a1.tags ->' osm_user ':: texto;

PostGIS

Nuestra biblioteca de software ofrece una descarga gratuita de PostGIS 2.0. Las siguientes versiones: 2.0, 1.5 y 1.4 son las más descargadas por los usuarios del programa. PostGIS fue desarrollado para funcionar en Windows XP, Windows Vista o Windows 7 y puede funcionar en sistemas de 32 bits.

PostGIS se clasifica como herramientas de desarrollo. Esta herramienta gratuita fue creada originariamente por Refractions Research. Nuestro antivirus integrado analizó esta descarga y la calificó como 100% segura. El archivo de instalación actual disponible para descargar requiere 11,2 MB de espacio en el disco duro.

PostGIS es un software único que agrega soporte para objetos geográficos a la base de datos relacional de objetos de PostgreSQL.

En efecto, PostGIS & quotspatially habilita & quot el servidor PostgreSQL, lo que le permite ser utilizado como una base de datos espacial back-end para sistemas de información geográfica (GIS), al igual que ESRI & # 039s SDE u Oracle & # 039s Spatial extension.

Quizás desee probar otros programas, como gshp2pgsql, Mapeador global o Thuban, que podría ser similar a PostGIS.


Vie, 29 de mayo de 2020

Distritos del consejo del condado de San Juan Recintos de votación del Consejo del Condado de San Juan

Para las Guías de votantes de LWV NM de este año en VOTE411.org, he estado haciendo muchos juegos de GIS, ya que el sistema necesita conocer los distritos de votación para cada carrera.

¿Pensaría que sería fácil encontrar GIS para los distritos electorales y mdash seguramente eso es información pública? & mdash, pero los condados y el estado se resisten notablemente a dar cualquier tipo de información (están felices de darle un PDF o JPG), por lo que encontrar los datos del distrito requiere mucha búsqueda.

A menudo, cuando finalmente logramos obtener información GIS, no es para lo que queremos. Por ejemplo, para el condado de San Juan, hay un archivo que afirma ser distritos de la Comisión del Condado (que se vería como la imagen de arriba a la izquierda), pero las formas del archivo son en realidad distritos de votación (arriba a la derecha). Un distrito se compone de distritos múltiples en San Juan, hay 77 distritos que componen cinco distritos.

En un caso como ese, necesita alguna forma de combinar varias formas (un grupo de recintos) en una (un distrito).


Загрузить для всех доступных архитектур
Архитектура Размер пакета В установленном виде Файлы
amd64 3 252,0 Кб7847,0 Кб [список файлов]
arm64 3 208,1 Кб7835,0 Кб [список файлов]
armel 3133,3 Кб7628,0 Кб [список файлов]
armhf 3152,6 Кб7 375,0 Кб [список файлов]
i386 3277,0 Кб8044,0 Кб [список файлов]
mips 3167,9 Кб7924,0 Кб [список файлов]
mips64el 3 192,9 Кб7 987,0 Кб [список файлов]
mipsel 3174,3 Кб7920,0 Кб [список файлов]
ppc64el 3297,8 Кб8412,0 Кб [список файлов]
s390x 3 201,5 Кб7849,0 Кб [список файлов]

Эта страница также доступна на следующих языках (Как установить язык по умолчанию):

Чтобы сообщить о проблеме, связанной с веб-сайтом, отправьте сообщение (на английском) в английском) в сравьтом. Прочую контактную информацию см. на странице Debian Как с нами связаться.

Авторские права & copy 1997 - 2021 SPI Inc. См. условия лицензии. Debian это торговый знак компании SPI Inc. Об этом сайте.


Другие пакеты, относящиеся к postgis

  • зависимости
  • рекомендации
  • предложения
  • realza
  • dep: libc6 (> = 2.27) [riscv64, sh4] библиотека GNU C: динамически подключаемые библиотеки
    также виртуальный пакет, предоставляемый libc6-udeb dep: libc6 (> = 2.29) [не alpha, riscv64, sh4]
  • dep: libc6.1 (> = 2.29) [alpha] библиотека GNU C: динамически подключаемые библиотеки
    также виртуальный пакет, предоставляемый libc6.1-udeb
  • dep: libgdal20 (> = 2.0.1) [sh4, x32] Пакет недоступен
  • dep: libgdal28 (> = 2.0.1) [не sh4, x32] Biblioteca de abstracción de datos geoespaciales
  • dep: libgeos-c1v5 (> = 3.4.2) [sh4] Motor de geometría para sistemas de información geográfica - Biblioteca C dep: libgeos-c1v5 (> = 3.6) [x32] dep: libgeos-c1v5 (> = 3.9.0) [ не sh4, x32]
  • dep: libgmpxx4ldbl (> = 2: 6.2.1 + dfsg) [hppa, m68k, sparc64] Biblioteca aritmética multiprecisión (enlaces C ++)
  • dep: libjson-c5 (> = 0.15) [hppa, m68k, sparc64] библиотека манипуляции JSON - разделяемая библиотека
  • dep: liblwgeom-2.4-0 (> = 2.0.0) [sh4] Biblioteca PostGIS & quotLightweight Geometry & quot
  • dep: libpq5 клиентская С-библиотека для PostgreSQL
  • dep: libproj15 (> = 4.9.0) [x32] Пакет недоступен
  • dep: libproj19 (> = 4.9.0) [не sh4, x32] Biblioteca de proyección cartográfica
  • dep: libsfcgal1 (> = 1.3.1) [hppa, m68k, sparc64] Biblioteca para ISO 19107: 2013 y OGC SFA 1.2 para operaciones 3D
  • rec: soporte de objetos geográficos postgis-doc para PostgreSQL - documentación
  • rec: postgresql-10-postgis-2.4 [sh4] Soporte de objetos geográficos para PostgreSQL 10
  • rec: postgresql-12-postgis-3 [x32] Soporte de objetos geográficos para PostgreSQL 12
  • rec: postgresql-postgis [не sh4, x32] виртуальный пакет, предоставляемый postgresql-12-postgis-3, postgresql-13-postgis-3
  • sug: soporte de objetos geográficos postgis-gui para PostgreSQL - programas GUI

  • Tipos de geometría para Points, LineStrings, Polygons, MultiPoints, MultiLineStrings, MultiPolygons y GeometryCollections.
  • Predicados espaciales para determinar las interacciones de geometrías utilizando el 3x3 DE-9IM (proporcionado por la biblioteca de software GEOS).
  • Operadores espaciales para determinar medidas geoespaciales como área, distancia, longitud y perímetro.
  • Operadores espaciales para determinar operaciones de conjuntos geoespaciales, como unión, diferencia, diferencia simétrica y búferes (proporcionados por GEOS). -over-GiST (árbol de búsqueda generalizada) índices espaciales para consultas espaciales de alta velocidad.
  • Soporte de selectividad de índices, para proporcionar planes de consulta de alto rendimiento para consultas espaciales / no espaciales mixtas.
  • Para datos ráster, PostGIS WKT Raster (ahora integrado en PostGIS 2.0+ y renombrado PostGIS Raster)

La implementación de PostGIS se basa en geometrías e índices "livianos" optimizados para reducir la huella de disco y memoria. El uso de geometrías ligeras ayuda a los servidores a aumentar la cantidad de datos migrados desde el almacenamiento en disco físico a la RAM, lo que mejora sustancialmente el rendimiento de las consultas.

PostGIS está registrado como "implementa el estándar especificado" para "Funciones simples para SQL" por el OGC. [2] PostGIS no ha sido certificado como compatible por la OGC.

Refractions Research lanzó la primera versión de PostGIS en 2001 bajo la Licencia Pública General GNU. Después de seis candidatos a lanzamiento, siguió una versión estable "1.0" el 19 de abril de 2005.

En 2006, la OGC registró PostGIS como "implementando el estándar especificado" para "Funciones simples para SQL". [3]


10 respuestas 10

"Golpear" en este contexto significa cortar hilos en un agujero. Para este tema, podemos pensar en tres cosas básicas que puede hacer un tornillo: perforar su propio orificio, roscar sus propias roscas o simplemente forzar su camino hacia el material arrancando un orificio o roscas en el proceso.

Usando esta imagen de ese artículo de wikipedia:

El tornillo superior es autoperforante. La punta afilada y dividida actúa como una broca para crear un orificio del tamaño adecuado. En la parte superior de ese punto de perforación, las roscas se estrechan y esta es la parte autorroscante. Todos los tornillos autoperforantes también se consideran autorroscantes, y la lengua vernácula común es simplemente llamarlos "autoperforadores".

Los siguientes tres tornillos de la imagen tienen una punta roma, por lo que no son capaces de perforar. Requieren un orificio pretaladrado, pero tienen una muesca o estría en la punta, y esto es lo que el tornillo puede usar para cortar sus propias roscas o "autoperforar". Estos son tornillos "autorroscantes" puros, pero no los ve a la venta en las grandes tiendas para el hogar. Se utilizan más en la industria para ensamblar productos a nivel de fábrica. Puedes comprarlos, simplemente no son tan comunes.

La entrada de Wikipedia está mal

Esta imagen de la página Wiki es solo tornillos regulares para chapa y no debería estar en una página que describa tornillos autorroscantes:

Estos no tienen punta de taladro y no tienen flauta para cortar hilos. Seguro que son un poco afilados, pero no lo suficiente como para hacer un agujero en la chapa. Necesitan un agujero del tamaño adecuado. Si se introducen en un agujero que es demasiado pequeño, rasgarán el agujero más ancho (si son más fuertes que la hoja de metal) y crearán una conexión más débil que un autorroscante que corta correctamente las roscas correctas.


El número de versión se ha eliminado del archivo lib address_standardize en PostGIS 2.5.0. Las funciones de soporte de ráster solo se pueden cargar en el mismo esquema con las funciones principales de PostGIS. El tipo ficticio pgis_abs se ha eliminado de las rutinas de agregación / recopilación. Se ha eliminado el soporte para drop support GEOS & lt 3.5 y PostgreSQL & lt 9.4.

  • Ha habido una mejora en el rendimiento para ordenar geometrías de PUNTO en PostGIS 2.5.0.
  • Se ha agregado un índice de banda de ráster externo a ST_BandMetaData. Además, hay una sección de Sugerencias sobre ráster en la documentación para obtener información sobre el comportamiento del ráster (p. Ej., Rendimiento de la base de datos, máximo de archivos abiertos).
  • El uso de GEOS en la implementación de topología se ha reducido en PostGIS 2.5.0.
  • Se corrigió un error que creaba MVT con valores de propiedad incorrectos en planes paralelos.
  • La geometría en PostGIS 2.5.0 se ha simplificado utilizando el tamaño de celda de la cuadrícula del mapa antes de generar MVT.
  • El orden de clasificación BTree ahora se ha definido en colecciones de geometrías VACÍAS y del mismo prefijo en PostGIS 2.5.0.
  • La función de geometría Hashable permite el uso directo en firmas CTE en PostGIS 2.5.0.
  • PostGIS 2.5.0 no aceptará puntos VACÍOS como nodos de topología.
  • ST_GeometricMedian ahora proporciona soporte para pesos de puntos en PostGIS 2.5.0.
  • Se ha eliminado el código duplicado en lwgeom_geos.

Para obtener más información sobre otras actualizaciones y correcciones en PostGIS 2.5.0, consulte las notas de la versión oficial.


Una guía para la rasterización de coberturas vectoriales en PostGIS

Una pregunta frecuente desde el comienzo de la aventura de PostGIS Raster ha sido "¿Cómo puedo convertir mi tabla de geometría en una cobertura de ráster?" (aqui tambien). La gente a menudo describe la forma de rasterizar una sola geometría usando ST_AsRaster () pero no conozco ningún texto o tutorial que explique cómo convertir una cobertura de vector completa en un solo ráster o en una cobertura de ráster en mosaico.

En este artículo describiré dos métodos para rasterizar una cobertura vectorial: uno muy rápido pero no muy flexible y otro muy flexible pero desafortunadamente un poco lento. Rasterizaré una cubierta forestal vectorial para que se alinee perfectamente con una capa de elevación ráster ya cargada. Usaré la columna "altura" de la cubierta forestal para asignar valores a los píxeles. Asumiré que ambas capas están en el mismo SRID y que el bosque solo cubre parcialmente la capa de elevación. La capa de elevación se divide en 625 mosaicos de 100x100 píxeles para un total de 6 250 000 píxeles.


"Inteligente" vector VS "estúpido" trama!

¿Por qué se pasaría de una tabla vectorial "inteligente" analizada por humanos, precisa, orientada a objetos, a una capa ráster "estúpida" sin analizar, irregular, de una sola variable? A lo largo de los años, solo pude identificar dos buenas razones para hacerlo. La primera es reunir todas sus capas de datos en un único paradigma de análisis (en este caso, el ráster) para simplificar la cadena de geoprocesamiento. La segunda es porque este paradigma de ráster "estúpido" sigue siendo también el más rápido cuando llega el momento de analizar un gran volumen de datos. El procesamiento de una pila de ráster se basa en operaciones matriciales muy simples generalmente disponibles a través de lo que la gente de geo llama operaciones de álgebra de mapas. Esto sigue siendo generalmente más rápido que el álgebra lineal necesaria para analizar coberturas vectoriales. De todos modos, nuestra tarea aquí no es decidir si hacerlo en modo vectorial es mejor que en modo ráster. Nuestra tarea es simplemente hacer la conversión correctamente & # 8230


"Rasterización" vs "representación"

Otro asunto interesante es la diferencia entre rasterizar y renderizar. La renderización es la conversión de un modelo vectorial en una imagen con fines de visualización. La rasterización es la conversión de un modelo vectorial a un ráster con fines de análisis de datos. Los renderizadores, como MapServer, GeoServer y Mapnik, además de combinar muchas capas, simbolizar geometrías y etiquetarlas, generalmente producirán suavizado a lo largo del borde de los polígonos y traducirán valores en colores simbólicos. Se pierde cualquier valor de datos original y no hay forma de utilizar el producto de un renderizador para el análisis GIS. Por otro lado, una función de rasterizador, como las proporcionadas por GDAL, QGIS, ArcGIS o PostGIS, producirá píxeles sin procesar tratando de representar la superficie del vector original de la manera más nítida y precisa posible, asignando a cada píxel uno de los valores (y solo esos valores) asociados con la geometría original. El ráster resultante de un proceso de rasterización es una entrada valiosa en una cadena de análisis de geoprocesamiento. El resultado de un proceso de renderizado no lo es. También debemos decir que aunque existen algunos métodos para rasterizar una cobertura vectorial en PostGIS, todavía no hay formas de renderizar una (a menos que considere ST_AsJPEG (), ST_AsTIFF () y ST_AsPNG () como renderizadores muy básicos).


Método 1.1 & # 8211 Basic ST_Union () y ST_Tile ()

El primer método de rasterización que presento es el que se planeó desde el comienzo del proyecto PostGIS Raster: simplemente convierta todas las geometrías en rásteres pequeños y únalas en un solo ráster como unimos muchas geometrías usando ST_Union (geometría). Una consulta completa, alineando el ráster resultante en una cobertura de ráster de elevación existente, debería verse así:


Primer plano de los sindicados rasterizados
versión de la cubierta forestal resultante
en áreas "irregulares" de la misma altura.
Este resultado es un ráster "grande" único, que agrega todas las rasterizaciones "pequeñas" de las geometrías.

Tenga en cuenta los argumentos de ST_AsRaster (). El primero es la geometría a rasterizar. El segundo es el ráster de referencia del que se toman prestados los parámetros de alineación (una esquina de píxeles xey, la escala (o tamaño de píxel) y la inclinación (o rotación)). El tercer argumento es el tipo de píxel del ráster esperado (flotante de 32 bits). El cuarto parámetro es el valor a asignar al píxel. Aquí está la columna 'altura' de la tabla de cobertura forestal. El último parámetro ('-9999') es el valor de nodata para asignar a los píxeles que rellenan el área que rodea cada geometría rasterizada. Esta es la primera variante de la función ST_AsRaster () en la referencia PostGIS Raster.

Al igual que su contraparte geométrica, ST_Union () simplemente agrega (fusiona) todos esos pequeños rásteres juntos en un ráster único. Sin ST_Union (), la consulta habría dado como resultado 2755 rásteres pequeños. Uno para cada geometría.

Tenga en cuenta también que seleccionamos solo un ráster de la capa de elevación como ráster de referencia para ST_AsRaster (). Esto se debe a que todos los rásteres de esta tabla están bien alineados y solo necesitamos un conjunto de coordenadas de esquinas de píxeles para alinear todo. También podríamos haber puesto esta consulta seleccionando un solo ráster directamente en la parte SELECT:


Normalmente no queremos mantener grandes rásteres en PostGIS para poder dividir el ráster combinado en mosaicos más pequeños que tengan las mismas dimensiones que la cobertura de elevación con la función ST_Tile ():


El mosaico de la cubierta forestal rasterizada, en rojo, no está bien
alineado con el mosaico del ráster de elevación, en gris.
Tenga en cuenta que los cuadrados son mosaicos de 100x100 píxeles, no píxeles.
Esto da como resultado 48 mosaicos, la mayoría de los cuales son 100x100 píxeles. Algunos tienen solo 18x100 píxeles y otros solo 100x46 píxeles. El de abajo a la derecha tiene solo 18x46 píxeles.

Hay 625 mosaicos de 100x100 píxeles en la cobertura de elevación y 2755 geometrías en la cobertura forestal. Estas geometrías cubren solo 31 de esos mosaicos y el gran ráster resultante cubre 56 de ellos. La consulta para crear el ráster "grande" tarda 5 segundos (gracias a Bborie Park, que aceleró ST_Union () en un factor enorme en PostGIS 2.1) y la consulta para volver a muestrear / volver a recopilar sólo tarda 2 segundos.

Un problema con este resultado es que aunque los píxeles están bien alineados con la capa de elevación y la mayoría de los mosaicos tienen las mismas dimensiones, los mosaicos en sí no están alineados con la cobertura de elevación y no cubren la misma área. El método 1.2 solucionará eso.


Método 1.2 & # 8211 ST_Union () y ST_MapAlgebra ()

Para producir una cobertura ráster que tenga una huella idéntica a la cobertura de elevación, debemos usar esta cobertura no solo para la alineación sino también como base para nuestros mosaicos finales. El truco consiste en "quemar" el gran ráster en mosaicos vacíos según cada uno de los mosaicos de elevación. Para eso usaremos una llamada ST_MapAlgebra () de dos rásteres bastante simple (!):


La función ST_MapAlgebra () de dos rásteres superpone los dos rásteres y calcula una expresión para cada conjunto alineado de dos píxeles. El resultado de esta expresión se convierte en el valor asignado a cada píxel de un nuevo ráster.

Como los dos rásteres no están necesariamente bien alineados, la nueva extensión del ráster puede ser igual a 1) la extensión de la unión de ambos ráster, 2) la extensión del área de intersección 3) la extensión del primer ráster o 4) la extensión del segundo ráster. Aquí, no hay dos rásteres involucrados en el álgebra de mapas que tengan la misma extensión. Como queremos "grabar" el ráster grande en mosaicos que tengan la misma extensión que los mosaicos de elevación, que son los segundos en la lista de argumentos, tenemos que especificar que el nuevo ráster tendrá la misma extensión que el ráster "SEGUNDO".

El primer argumento es el ráster de altura del bosque "grande". Es la única fila de la tabla forestheight_rast.

El segundo argumento es un nuevo mosaico generado con ST_MakeEmptyRaster () y ST_AddBand () de cada uno de los 626 mosaicos de elevación. Podríamos haber utilizado los mosaicos originales directamente, pero dado que estamos especificando la extensión resultante como "SEGUNDO" y que el valor de nodata del resultado de ST_MapAlgebra () se selecciona del ráster "FIRST" o "SEGUNDO" cuando esos valores se especifican, entonces el ráster resultante habría tenido 32767 como valor de nodata. Este es el valor de nodata de la cobertura del ráster de elevación. Queremos que el valor de nodata del resultado sea el mismo que el de la cobertura de altura del bosque, que es -9999. Así que el truco es "construir" un nuevo mosaico desde cero con ST_MakeEmptyRaster () con los mosaicos de elevación originales como referencia de alineación y agregarles una banda con ST_AddBand () especificando un tipo de pixel ('32BF'), un valor inicial ('- 9999 ') y un valor de nodata (' -9999 ') idéntico al ráster de altura del bosque.

El tercer argumento es la expresión que calcula el valor a asignar a cada píxel. Los valores de píxeles del primer ráster se denominan "[rast1]" y los valores de píxeles del segundo ráster se denominan "[rast1]". También puede hacer referencia a la coordenada x del píxel con "[rast.x]" y la coordenada y con "[rast.y]". La expresión es cualquier expresión normal de PostgreSQL como, por ejemplo, "([rast1] + [rast2]) / 2".

En nuestro caso, la expresión es simplemente el valor del primer ráster, el de la altura del bosque, que queremos "grabar" en el mosaico. No involucra valores del ráster de elevación. En otras palabras, los mosaicos de elevación se utilizan simplemente como trozos de papel en blanco bien alineados en los que "imprimimos" el valor del ráster de altura del bosque.

El cuarto argumento es el tipo de píxel ('32BF') esperado para el ráster resultante. Es lo mismo que el ráster de altura del bosque.

El último argumento ('SEGUNDO') le dice a ST_MapAlgebra () que use la extensión del segundo ráster (los mosaicos de elevación) para construir el ráster resultante.

Por lo tanto, ST_MapAlgebra () copiará cada valor del ráster de altura del bosque en nuevos mosaicos vacíos cuyas dimensiones se basan en las de elevación. La consulta da como resultado 625 mosaicos. Cuando un mosaico no se cruza con el área cubierta por la cubierta forestal, todos sus píxeles simplemente se establecen en nodata.

Si su gran ráster no cubre gran parte de la cobertura del ráster de referencia, puede acelerar el proceso agregando un índice espacial a la cobertura de referencia (ya debería estar allí) y restringiendo el cálculo ST_MapAlgebra () a los mosaicos que se cruzan con la cobertura vectorial. :


Sin embargo, tenga en cuenta que esta consulta es más rápida porque no procesa y, por lo tanto, no devuelve mosaicos que no toquen el área de cobertura forestal. Si desea producir un juego completo de mosaicos, idéntico en número y extensión a la cobertura de elevación, continúe con la consulta anterior.


Algunos inconvenientes de los métodos que utilizan ST_AsRaster () y ST_Union ()

  • ST_Union limitado por RAM - Cualquier consulta que involucre a ST_Union () está limitada por la RAM disponible para PostgreSQL. Si el gran ráster resultante de la unión de todas las geometrías rasterizadas es más grande que la RAM disponible, la consulta fallará. El truco para evitar esto es agregar los rásteres pequeños no en un ráster único enorme, sino en grupos más pequeños de rásteres que se cruzan con mosaicos del ráster de referencia. El método 1.3 mostrará cómo hacerlo.

Esto se debe a que ST_AsRaster () rasteriza solo una geometría a la vez sin tener en cuenta otras geometrías que se cruzan con el píxel. Si considera todas las geometrías de una capa al asignar un valor, es posible que desee asignar otras métricas a los píxeles como el recuento de geometría que se cruza con el píxel, la longitud total de todas las polilíneas que se cruzan con el píxel, el valor asociado con el polígono más pequeño que se cruza con el píxel, etc.

Este método es seguro para RAM ya que nunca produce un ráster "grande" más grande que el área cubierta por un mosaico del ráster de referencia. Es un poco más lento que la primera consulta del método 1.2 porque une algunos rásteres muchas veces cuando tocan muchos mosaicos. También produce 625 mosaicos como la cobertura de elevación.


La primera consulta en la instrucción WITH (forestrast) rasteriza las geometrías, únelas por grupo intersecando los mosaicos ráster de referencia y quema cada uno de ellos en un mosaico nuevo como se vio antes. Esto se hace mediante la adición de una cláusula WHERE que limita la operación a las geometrías que se cruzan con mosaicos y una cláusula GROUP BY que asegura que ST_Union () solo agrega rásteres pequeños "pertenecientes" al mismo mosaico.

Sin embargo, la cláusula WHERE hace que la extensión se limite al área cubierta por la cubierta forestal. Esta primera parte por sí sola devolvería solo 32 fichas. La segunda parte de la consulta asegúrese de que obtengamos los 593 mosaicos restantes. Utiliza una LEFT OUTER JOIN para asegurarse de que se devuelva una fila por cada 625 mosaicos de la cobertura del ráster de referencia. Cuando la eliminación de la cobertura del ráster de referencia coincide con uno de los 32 mosaicos, estos mosaicos se devuelven. De lo contrario, se devuelve un nuevo mosaico vacío. Puede omitir esta parte si su capa de vector de origen cubre el área completa del ráster de referencia o si desea limitar el área rasterizada a la de la capa de vector.


Método 2 y # 8211 Complementos de PostGIS ST_ExtractToRaster ()

Como se dijo antes, ST_AsRaster () es bastante limitado en términos del tipo de valor que puede asignar a los píxeles. No se pueden extraer tantos valores de un solo polígono: el valor en el centroide, la proporción del área de píxeles cubierta, el valor ponderado por esta proporción, la longitud de la parte de intersección de una polilínea que se rasteriza. ST_AsRaster () sin embargo, debido a que está basado en GDAL, solo implementa el primero.

Además, se pueden imaginar muchas más métricas si el valor asignado a cada píxel proviene no solo de una geometría, sino de la agregación de todas las geometrías (o los valores asociados con ellas) de una cobertura vectorial que interseca el centroide o la superficie del píxel. . Por ejemplo, podríamos querer calcular el número de geometrías que se cruzan con el píxel. Podría interesarnos el valor del polígono que cubre la mayor parte del píxel o de la polilínea que tiene la longitud más larga dentro del píxel. Es posible que deseemos fusionar geometrías que tengan el mismo valor antes de calcular la métrica. Pude identificar casi 76 diferentes métricas posibles extraíbles de coberturas de puntos, polilíneas y polígonos.

Por lo tanto, necesitamos una función que sea capaz de extraer métricas de una cobertura vectorial en su conjunto y que nos permita implementar nuevos métodos de extracción fácilmente. La función ST_ExtractToRaster () de los complementos de PostGIS se escribió exactamente con este objetivo en mente.

Los complementos de PostGIS son un conjunto de aproximadamente 15 funciones escritas por la comunidad PL / pgSQL puras que ayudan a escribir consultas PostGIS avanzadas. Una de las funciones más útiles es ST_ExtractToRaster ().

Una consulta que usa ST_ExtractToRaster (), que devuelve el mismo conjunto de mosaicos que el método 1.3 y que tampoco sufre limitaciones de RAM se vería así:


Primera y muy importante observación: ¡esta consulta tarda unos 200 segundos! ¡Esto es aproximadamente 16 veces más que la consulta segura de RAM equivalente del método 1.3! Esto se debe a que ST_ExtractToRaster () hace mucho más que ST_AsRaster (). No solo considera la cobertura completa, puede calcular cosas muy diferentes de esta cobertura. Definitivamente no vale la pena usar ST_ExtractToRaster () si lo que desea es el valor de la geometría que se cruza con el centroide de píxeles. El interés de esta función son los otros métodos disponibles.

Tenga en cuenta el último argumento de ST_ExtractToRaster (): 'MEAN_OF_VALUES_AT_PIXEL_ CENTROID'. Este es el método utilizado para extraer un valor para el píxel. Quince (15) de estos métodos se han implementado con ST_ExtractToRaster () hasta ahora. Se enumeran a continuación con una breve descripción.

El método 'MEAN_OF_VALUES_AT_PIXEL_CENTROID' devuelve una cobertura de ráster cuyos valores son idénticos a la cobertura de ráster producida con los métodos anteriores. La mayoría de los otros métodos, sin embargo, devolverán rásteres bastante diferentes & # 8230

Los otros argumentos de ST_ExtractToRaster () son bastante triviales: el primero es el ráster al que se extraen los valores. Es una buena práctica pasar una nueva banda de ráster vacía que tenga el tipo de píxel, el valor inicial y el valor de nodatos correctos y cuya alineación se base en mosaicos del ráster de referencia. Esto es idéntico a lo que hicimos en 1.2 y 1.3. El segundo argumento es el esquema de la tabla de vectores a rasterizar ('público'). El tercero y el cuarto son el nombre de la tabla ('forestcover') y el nombre de la columna ('geom') que contiene la geometría a rasterizar. El quinto argumento es la columna que contiene el valor que se utilizará en el cálculo de un nuevo valor cuando sea necesario ('altura'). Cuando el cálculo involucra solo geometrías (por ejemplo, COUNT_OF_VALUES_AT_PIXEL_ CENTROID o SUM_OF_LENGTHS), este argumento no es necesario.

La consulta devolverá un nuevo ráster para cada ráster en la tabla de elevación, en este caso 625.

  • COUNT_OF_VALUES_AT_PIXEL_CENTROID: Número de geometrías que se cruzan con el centroide de píxeles.
  • MEAN_OF_VALUES_AT_PIXEL_CENTROID: Promedio de todos los valores que se cruzan con el centroide de píxeles.
  • COUNT_OF_POLYGONS: Número de polígonos o multipolígonos que se cruzan con la superficie del píxel.
  • COUNT_OF_LINESTRINGS: Número de cadenas de líneas o cadenas múltiples que se cruzan con la superficie de píxeles.
  • COUNT_OF_POINTS: Número de puntos o multipuntos que se cruzan con la superficie de píxeles.
  • COUNT_OF_GEOMETRIES: Número de geometrías (sean las que sean) que se cruzan con la superficie del píxel.
  • VALUE_OF_BIGGEST: Valor asociado con el polígono que cubre el área más grande que se cruza con la superficie del píxel.
  • VALUE_OF_MERGED_BIGGEST: Valor asociado con el polígono que cubre el área más grande que se cruza con la superficie del píxel. Los polígonos con valores idénticos se fusionan antes de calcular el área de la superficie.
  • VALUE_OF_MERGED_SMALLEST: Valor asociado con el polígono que cubre el área más pequeña del píxel. Los polígonos con valores idénticos se fusionan antes de calcular el área de la superficie.
  • MIN_AREA: Área de la geometría que ocupa la parte más pequeña de la superficie del píxel.
  • SUM_OF_AREAS: Suma de las áreas de todos los polígonos que se cruzan con la superficie del píxel.
  • SUM_OF_LENGTHS: Suma de las longitudes de todas las cadenas de líneas que se cruzan con la superficie del píxel.
  • PROPORTION_OF_COVERED_AREA: Proporción, entre 0.0 y 1.0, de la superficie de píxeles cubierta por la unión de todos los polígonos que se cruzan con la superficie de píxeles.
  • AREA_WEIGHTED_MEAN_OF_VALUES: Media de todos los valores de polígono ponderados por el área que ocupan en relación con el píxel que se está procesando. La suma ponderada se divide por el máximo entre el área de intersección de la geometría y la suma de todas las áreas geométricas ponderadas. Eso significa que si el píxel que se está procesando no está completamente cubierto por polígonos, el valor se multiplica por la proporción del área de cobertura. Por ejemplo, si un polígono cubre solo el 25% de la superficie de píxeles y no hay otros polígonos que cubran la superficie, solo el 25% del valor asociado con el polígono de cobertura se asigna al píxel. Este es generalmente el comportamiento favorito.
  • AREA_WEIGHTED_MEAN_OF_VALUES_2: Media de todos los valores de polígono ponderados por el área que ocupan en relación con el píxel que se está procesando. La suma ponderada se divide por la suma de todas las áreas geométricas ponderadas. Eso significa que si el píxel que se está procesando no está completamente cubierto por polígonos, el valor ponderado completo se asigna al píxel. Por ejemplo, incluso si un polígono cubre solo el 25% de la superficie del píxel, el 100% de su valor se asigna al píxel.

¿Quiere calcular otras métricas esotéricas con ST_ExtracToRaster ()? Internamente, la función usa la versión de devolución de llamada de ST_MapAlgebra () que llama a una de las dos devoluciones de llamada predefinidas dependiendo de si el valor se calcula para el centroide del píxel o si el valor se calcula utilizando la superficie completa del píxel. Esas funciones se denominan ST_ExtractPixelCentroidValue4ma () y ST_ExtractPixelValue4ma (). Cumplen con los criterios para las funciones de devolución de llamada ST_MapAlgebra (). Toman tres argumentos que definen el valor del píxel de entrada (puede haber muchos), la posición del píxel en el ráster y algunos parámetros adicionales cuando sea necesario. Para construir una consulta para cada píxel, ambas funciones esperan parámetros adicionales: los parámetros de alineación del ráster para el que se calculan los valores y los parámetros de la columna de geometría para la que se extraen los valores. Las devoluciones de llamada luego definen una serie de métodos de extracción.

To add a new method to these callbacks, you can simply copy the query associated with an existing method that extract a value similar to what you want to extract, give it a proper name, modify it to compute the expected value and make sure it uses the callback extra arguments properly. It is a good idea to test the query directly on the vector coverage prior to test it in one of the two callback. Most of the methods do a ST_Intersects() between the shape of the pixel and the vector coverage (this is why it is important that the vector coverage be spatially indexed) and extract some metrics from the list of intersecting geometries.

If you add a new method which might be useful to others, let me know. I will add it to the PostGIS Add-ons code…

Rasterizing a complete vector coverage can be done very quickly with ST_AsRaster() and ST_Union() but some projects require more sophisticated methods to assign values to pixels considering the coverage as a whole. PostGIS Add-ons ST_ExtractToRaster() is slow but provides much more control on the metric that is extracted from the vector coverage.

In both case it is possible to extract values following a preloaded reference tiled coverage. That should be the case for most applications. It is also easy to add more extraction methods to ST_ExtractToRaster().


PostGIS 2.0 and Self Intersecting Features - Geographic Information Systems

The AST-PostGIS is an extension for PostgreSQL/PostGIS that incorporates advanced spatial data types and implements spatial integrity constraints. The extension reduces the distance between the conceptual and the physical designs of spatial databases, by providing richer representations for geo-object and geo-field geometries. It also offers procedures to assert the consistency of spatial relationships during data updates. Such procedures can also be used before enforcing spatial integrity constraints for the first time.

Geometric primitives defined by OGC and ISO standards, implemented in most modern spatially-enabled database management systems (DBMS), are unable to capture the semantics of richer representation types, as found in current geographic data models. Moreover, relational DBMSs do not extend referential integrity mechanisms to cover spatial relationships and to support spatial integrity constraints. Rather, they usually assume that all spatial integrity checking will be carried out by the application, during the data entry process. This is not practical if the DBMS supports many applications, and can lead to redundant work.

This module has been tested on:

And requires the extensions:

If you aren't using the pg_config on your path (or don't have it on your path), specify the correct one to build against:

Or to build with what's on your path, just:

After you've built and installed the artifacts, fire up psql :

Use the pre-builded docker with:

Here is explained how the extension works.

Advanced Spatial Data Types

Advanced Spatial Types are essentially the primitive geometric types of PostGIS together with a set of spatial integrity constraints to control their behavior. These new spatial data types can be handled in the same way the primitive types are, as they can be employed as column definition of tables, as variables in PL/pgSQL scripts or as arguments of functions or stored procedures. They can also be stored, retrieved and updated with the geometry processing functions of PostGIS.

The following table shows the eleven advanced spatial data types implemented by the extension and how they are mapped to the PostGIS types. These types are derived from the concepts of geo-objects and geo-fields classes of the OMT-G data model.

Spatial Class Advanced spatial datatypes PostGIS Type
Polígono ast_polygon geometry(polygon)
Línea ast_line geometry(linestring)
Punto ast_point geometry(point)
Node ast_node geometry(point)
Isoline ast_isoline geometry(linestring)
Planar subdivision ast_planarsubdivision geometry(polygon)
Triangular Irregular Network (TIN) ast_tin geometry(polygon)
Tesselation ast_tesselation raster
Muestra ast_sample geometry(point)
Unidirectional line ast_uniline geometry(linestring)
Bidirectional line ast_biline geometry(linestring)

Trigger procedures for relationship integrity constraints

The following procedures can be called by triggers to assert the consistency of spatial relationships, like topological relationship, arc-node and arc-arc networks or spatial aggregation.

Spatial Relationship Trigger Procedure
Topological Relationship ast_topologicalrelationship(a_tbl, a_geom, b_tbl, b_geom, spatial_relation)
Topological Relationship (distant, near) ast_topologicalrelationship(a_tbl, a_geom, b_tbl, b_geom, spatial_relation, distance)
Arc-Node Network ast_arcnodenetwork(arc_tbl, arc_geom, node_tbl, node_geom)
Arc-Arc Network ast_arcnodenetwork(arc_tbl, arc_geom)
Spatial Aggregation ast_aggregation(part_tbl, part_geom, whole_tbl, whole_geom)

The spatial_relation argument, which are passed as an argument to the topological relationship procedure, can be one of the following:

  • contiene
  • containsproperly
  • cubre
  • coveredby
  • crosses
  • disjoint
  • distante
  • se cruza
  • cerca
  • overlaps
  • touches
  • dentro de

Consistency check functions

The SQL functions listed in this section can be called to analyze the consistency of the spatial database before the initial enforcement of constraints. These functions return the state of the database ( true = valid, false = invalid) and register, in the ast_validation_log table, the details of each inconsistency encountered.

Spatial Relationship Check functions
Topological Relationship ast_isTopologicalRelationshipValid(a_tbl text, a_geom text, b_tbl text, b_geom text, relation text)
Topological Relationship (near) ast_isTopologicalRelationshipValid(a_tbl text, a_geom text, b_tbl text, b_geom text, dist real)
Arc-Node Network ast_isNetworkValid(arc_tbl text, arc_geom text, node_tbl text, node_geom text)
Arc-Arc Network ast_isNetworkValid(arc_tbl text, arc_geom text)
Spatial Aggregation ast_isSpatialAggregationValid(part_tbl text, part_geom text, whole_tbl text, whole_geom text)

This section shows an use case example (also available in the examples folder) intended to clarify the use of this extension.

The following figure shows a schema fragment for a bus transportation network (nodes at bus stops and unidirectional arcs corresponding to route segments) that serves a set of school districts. A conventional class holds the attributes for the bus line. The schema embeds spatial integrity constraints for (1) the network relationship (each route segment must be related to two bus stops), (2) a “contains” relationship (school district cannot exists without a bus stop), and (3) the geometry of route segments and school districts (lines and polygons must be simple, i.e., with no self-intersections).

The implementation of this schema that uses the ast_postgis extension and considers all the spatial constraints is as follows:

AST-PostGIS is released under a MIT license.

Copyright (c) 2016 Luís Eduardo Oliveira Lizardo.

[1] K. A. V. Borges, C. A. Davis Jr., and A. H. F. Laender. OMT-G: an object-oriented data model for geographic applications. GeoInformatica, 5(3):221–260, 2001.

[2] L. E. O. Lizardo and C. A. Davis Jr. OMT-G Designer: a web tool for modeling geographic databases in OMT-G. In Advances in Conceptual Modeling: 33rd International Conference on Conceptual Modeling, ER 2014, volume 8823 of Lecture Notes in Computer Science, pages 228–233. Springer International Publishing, 2014.

[3] Lizardo, L. E. O., & Davis Jr, C. A. (2017, November). A PostGIS extension to support advanced spatial data types and integrity constraints. In Proceedings of the 25th ACM SIGSPATIAL International Conference on Advances in Geographic Information Systems (pp. 1-10).


PostGIS 2.0 and Self Intersecting Features - Geographic Information Systems

An open source geospatial trajectory data management & analysis platform

MobilityDB is a database management system for moving object geospatial trajectories, such as GPS traces. It adds support for temporal and spatio-temporal objects to the PostgreSQL database and its spatial extension PostGIS.

MobilityDB is developed by the Computer & Decision Engineering Department of the Université Libre de Bruxelles (ULB) under the direction of Prof. Esteban Zimányi. ULB is an OGC Associate Member and member of the OGC Moving Feature Standard Working Group (MF-SWG).

The MobilityDB project is managed by a steering committee.

Compact geospatial trajectory data storage

Big data scale and performance

Easy to use full SQL interface

Compatible with the PostgreSQL ecosystem

Compliant with the Moving Features standards from the Open Geospatial Consortium (OGC).

Database adapters to access MobilityDB from Python are also available

    supports both the psycopg2 and the asyncpg adapters for PostgreSQL and uses the postgis adapter for PostGIS. This package is developed by the MobilityDB Team. is another independent package that provides extensions to SQLAlchemy for interacting with MobilityDB.

Data generator and benchmark tool based on the BerlinMOD benchmark. The data generator takes input data from Open Street Map and uses pgRouting to generate routes between pairs of source and target locations.

  • El Maestro branch has the latest release
  • El develop branch has the development of the next release. The complete list of releases is available here

The extension is under development. We are planning to release the first version in 2021.

  • Linux (other UNIX-like systems may work, but remain untested)
  • PostgreSQL > 10
  • CMake >= 3.1
  • PostGIS == 2.5
  • JSON-C
  • GNU Scientific Library (GSL)
  • Development files for PostgreSQL, PostGIS/liblwgeom, PROJ & JSON-C

For example, you can build the following command to install all MobilityDB build dependencies for Debian-based systems:

You should also set the following in postgresql.conf:

Docker containers with MobilityDB and all its dependencies are available here. These images are based on the official Postgres and Postgis docker images, please refer to them for more information.

If you have docker installed in your system you can run:

The first command is to download the latest most up-to-date image of MobilityDB. The second command creates a volume container on the host, that we will use to persist the PostgreSQL database files outside of the MobilityDB container. The third command executes this binary image of PostgreSQL, PostGIS, and MobilityDB with the TCP port 5432 in the container mapped to port 25432 on the Docker host (user = pw = docker, db = mobilitydb). The fourth command is to connect to the database using psql.

Please report any issues you may have

If you are in the doc directory of MobilityDB you can generate the user's manual from the sources as follows:


Ver el vídeo: QGeek 004 - NETWORK ANALYSIS IN QGIS - POSTGISPGROUTINGOSM2PGROUTING