Lagi

Fitur PostGIS 2.0 dan Self Intersecting


Saya memiliki kelas fitur poligon yang dibuat oleh OpenStreetMap yang mengembalikan kesalahan persimpangan diri. Apakah ada cara untuk menyaring fitur-fitur ini? Bisakah saya menggunakan pernyataan SQL untuk menemukan poligon kesalahan?


Permintaan untuk

ST_IsValid([geometri Anda]) = 'f'

Persimpangan sendiri tidak berbahaya seperti persimpangan non-noded. Berikut adalah beberapa solusi 4 U:

Perbaikan otomatis oleh ST_MakeValid:

perbarui mytable set way = ST_Makevalid(way) dimana st_isvalid(way)=false

Dan serupa, tetapi menggunakan st_buffer:

perbarui mytable set way = ST_Buffer(way,0) dimana st_isvalid(way)=false

Jika tidak membantu, ini akan memberi Anda koordinat di mana persimpangan terjadi:

pilih abs(a1.osm_id) sebagai OSM_ID, reason(ST_IsValidDetail(a1.way)) sebagai Reason, ST_asText(ST_TRANSFORM(ST_SetSRID(location(ST_IsValidDetail(a1.way)),900913),4326)) sebagai lokasi dari planet_osm_polygon a1 dimana st_isvalid(a1.way) = false

Anda dapat memuatnya ke QGIS sebagai lapisan kueri menggunakan kueri ini:

pilih row_number() over() sebagai GID, location(ST_IsValidDetail(a1.way) sebagai cara dari planet_osm_polygon a1 di mana st_isvalid(a1.way) = false

Jika Anda menggunakan skema osm2pgsql dan Anda ingin memperbaikinya di proyek OSM, Anda dapat menjalankan kueri ini dan menyimpan hasilnya sebagai file XML. Jika Anda akan membukanya dengan browser Anda, Anda dapat melihat persimpangan ini di OSM atau memuatnya ke JOSM untuk memperbaikinya (query tidak diuji jadi mungkin perlu beberapa penyetelan):

pilih abs(a1.osm_id) sebagai OSM_ID, alasan(ST_IsValidDetail(a1.way)) sebagai Alasan, ST_asText(ST_TRANSFORM(ST_SetSRID(location(ST_IsValidDetail(a1.way)),900913),4326)) sebagai lokasi, a1.tags -> 'osm_user'::teks sebagai PENGGUNA, 'Sunting di JOSM' sebagai jomblo, 'Sunting di JOSM' sebagai Area_in_JOSM, 'Tunjukkan di peta' sebagai OSM dari planet_osm_polygon a1 di mana st_isvalid(a1.way) = urutan palsu oleh a1.tags -> 'osm_user'::text;

PostGIS

Pustaka perangkat lunak kami menyediakan unduhan gratis dari PostGIS 2.0. Versi berikut: 2.0, 1.5 dan 1.4 adalah yang paling sering diunduh oleh pengguna program. PostGIS dikembangkan untuk bekerja pada Windows XP, Windows Vista atau Windows 7 dan dapat berfungsi pada sistem 32-bit.

PostGIS dikategorikan sebagai Alat Pengembangan. Alat gratis ini awalnya dibuat oleh Refractions Research. Antivirus bawaan kami memindai unduhan ini dan menilainya sebagai 100% aman. File pengaturan saat ini yang tersedia untuk diunduh membutuhkan ruang hard disk 11,2 MB.

PostGIS adalah perangkat lunak unik yang menambahkan dukungan untuk objek geografis ke database relasional objek PostgreSQL.

Akibatnya, PostGIS "mengaktifkan" server PostgreSQL, memungkinkannya untuk digunakan sebagai basis data spasial back-end untuk sistem informasi geografis (GIS), seperti ekstensi SDE ESRI atau Oracle Spasial.

Anda mungkin ingin melihat lebih banyak perangkat lunak, seperti gshp2pgsql, Pemeta Global atau Thuban, yang mungkin mirip dengan PostGIS.


Jum, 29 Mei 2020

Distrik Dewan Kabupaten San Juan Tempat pemungutan suara Dewan Kabupaten San Juan

Untuk Panduan Pemilih LWV NM tahun ini di VOTE411.org, saya telah melakukan banyak mengutak-atik GIS, karena sistem perlu mengetahui distrik pemungutan suara untuk setiap balapan.

Anda akan berpikir akan mudah untuk menemukan GIS untuk distrik pemungutan suara &mdash pasti itu informasi publik? &mdash tetapi kabupaten dan negara bagian sangat menolak memberikan data apa pun (mereka dengan senang hati memberi Anda PDF atau JPG), jadi menemukan data distrik membutuhkan banyak pencarian.

Seringkali, ketika kita akhirnya berhasil mendapatkan info GIS, itu tidak sesuai dengan yang kita inginkan. Misalnya, untuk San Juan County, ada file yang mengklaim sebagai distrik Komisi County (yang akan terlihat seperti gambar di kiri atas), tetapi bentuk dalam file tersebut sebenarnya adalah daerah pemungutan suara (kanan atas). Sebuah distrik terdiri dari beberapa distrik di San Juan, ada 77 distrik yang membentuk lima distrik.

Dalam kasus seperti itu, Anda memerlukan beberapa cara untuk menggabungkan beberapa bentuk (sekelompok kawasan) menjadi satu (distrik).


агрузить е оступных архитектур
ектура азмер акета ановленном е айлы
amd64 3 252,07 847,0 [список айлов]
arm64 3 208,17 835,0 [список айлов]
armel 3 133,37 628,0 [список айлов]
armhf 3 152,67 375,0 [список айлов]
i386 3 277.0 Кб8 044,0 [список айлов]
mips 3 167,97 924,0 [список айлов]
mips64el 3 192,97 987,0 [список айлов]
mipsel 3 174,37 920,0 [список айлов]
ppc64el 3 297,88 412,0 [список айлов]
s390x 3 201,57 849,0 [список айлов]

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

обы ообщить о облеме, анной еб-сайтом, отправьте ообщение (на английском) ок ассылки [email protected] очую онтактную ормацию . а анице Debian а ами аться.

орские ава © 1997 - 2021 SPI Inc. . о е. Debian о орговый ак омпании SPI Inc. ом айте.


Е акеты, относящиеся postgis

  • ависимости
  • екомендации
  • едложения
  • meningkatkan
  • 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] Perpustakaan Abstraksi Data Geospasial
  • dep: libgeos-c1v5 (>= 3.4.2) [sh4] Mesin geometri untuk Sistem Informasi Geografis - C Library dep: libgeos-c1v5 (>= 3.6) [x32] dep: libgeos-c1v5 (>= 3.9.0) [ di sh4, x32]
  • dep: libgmpxx4ldbl (>= 2:6.2.1+dfsg) [hppa, m68k, sparc64] Pustaka aritmatika multipresisi (binding C++)
  • dep: libjson-c5 (>= 0.15) [hppa, m68k, sparc64] отека анипуляции JSON — азделяемая отека
  • dep: liblwgeom-2.4-0 (>= 2.0.0) [sh4] Pustaka PostGIS "Geometri Ringan"
  • dep: libpq5 ентская -библиотека dan PostgreSQL
  • dep: libproj15 (>= 4.9.0) [x32] oleh едоступен
  • dep: libproj19 (>= 4.9.0) [не sh4, x32] Pustaka proyeksi kartografi
  • dep: libsfcgal1 (>= 1.3.1) [hppa, m68k, sparc64] Library untuk ISO 19107:2013 dan OGC SFA 1.2 untuk operasi 3D
  • rec: postgis-doc Dukungan objek Geografis untuk PostgreSQL -- dokumentasi
  • rec: postgresql-10-postgis-2.4 [sh4] Dukungan objek geografis untuk PostgreSQL 10
  • rec: postgresql-12-postgis-3 [x32] Dukungan objek geografis untuk PostgreSQL 12
  • rec: postgresql-postgis [не sh4, x32] виртуальный акет, едоставляемый postgresql-12-postgis-3, postgresql-13-postgis-3
  • sug: postgis-gui Dukungan objek geografis untuk PostgreSQL -- program GUI

  • Jenis geometri untuk Points, LineStrings, Polygons, MultiPoints, MultiLineStrings, MultiPolygons, dan GeometryCollections.
  • Predikat spasial untuk menentukan interaksi geometri menggunakan 3x3 DE-9IM (disediakan oleh perpustakaan perangkat lunak GEOS).
  • Operator spasial untuk menentukan pengukuran geospasial seperti luas, jarak, panjang dan keliling.
  • Operator spasial untuk menentukan operasi set geospasial, seperti gabungan, perbedaan, perbedaan simetris, dan buffer (disediakan oleh GEOS). -over-GiST (Generalized Search Tree) indeks spasial untuk kueri spasial berkecepatan tinggi.
  • Dukungan selektivitas indeks, untuk menyediakan rencana kueri berkinerja tinggi untuk kueri spasial/non-spasial campuran.
  • Untuk data raster, PostGIS WKT Raster (sekarang terintegrasi ke dalam PostGIS 2.0+ dan berganti nama menjadi PostGIS Raster)

Implementasi PostGIS didasarkan pada geometri dan indeks "ringan" yang dioptimalkan untuk mengurangi jejak disk dan memori. Menggunakan geometri ringan membantu server meningkatkan jumlah data yang dimigrasikan dari penyimpanan disk fisik ke RAM, meningkatkan kinerja kueri secara substansial.

PostGIS terdaftar sebagai "menerapkan standar yang ditentukan" untuk "Fitur Sederhana untuk SQL" oleh OGC. [2] PostGIS belum disertifikasi sebagai patuh oleh OGC.

Refractions Research merilis versi pertama PostGIS pada tahun 2001 di bawah GNU General Public License. Setelah enam kandidat rilis, versi stabil "1.0" menyusul pada 19 April 2005.

Pada tahun 2006 OGC mendaftarkan PostGIS sebagai "menerapkan [ing] standar yang ditentukan" untuk "Fitur Sederhana untuk SQL". [3]


10 Jawaban 10

Untuk "ketuk" dalam konteks ini berarti memotong benang ke dalam lubang. Untuk topik ini, kita dapat memikirkan tiga hal dasar yang dapat dilakukan sekrup - mengebor lubangnya sendiri, mengetuk ulirnya sendiri, atau memaksa masuk ke dalam material dengan merobek lubang atau ulir dalam prosesnya.

Menggunakan gambar ini dari artikel wikipedia itu:

Sekrup atas mengebor sendiri. Titik pisah yang tajam berfungsi sebagai mata bor untuk membuat lubang dengan ukuran yang tepat. Di bagian atas titik bor itu, benang meruncing ke atas, dan ini adalah bagian self-tapping. Semua sekrup self-drilling juga dianggap self-tapping, dan bahasa sehari-hari yang umum adalah menyebutnya "self-tapper".

Tiga sekrup berikutnya pada gambar memiliki ujung tumpul, sehingga tidak mampu mengebor. Mereka membutuhkan lubang yang telah dibor sebelumnya, tetapi mereka memiliki takik atau seruling di ujungnya, dan sekrup inilah yang dapat digunakan untuk memotong ulirnya sendiri atau "mengetuk sendiri". Ini adalah sekrup "self-tapping" murni, tetapi Anda tidak melihatnya dijual di toko-toko rumah besar. Mereka lebih banyak digunakan di industri untuk merakit barang di tingkat pabrik. Anda dapat membelinya - mereka tidak biasa.

Entri Wikipedia salah

Gambar dari halaman Wiki ini hanya sekrup lembaran logam biasa dan tidak boleh berada di halaman yang menjelaskan sekrup self-tapping:

Ini tidak memiliki ujung bor, dan mereka tidak memiliki seruling untuk memotong benang. Tentu mereka sedikit tajam, tetapi tidak cukup tajam untuk membuat lubang di lembaran logam. Mereka membutuhkan lubang dengan ukuran yang tepat. Jika didorong ke dalam lubang yang terlalu kecil, mereka akan merobek lubang lebih lebar (jika lebih kuat dari lembaran logam) dan membuat sambungan yang lebih lemah daripada penyadap sendiri yang memotong benang yang benar dengan benar.


Nomor Versi telah dihapus dari file lib address_standardize di PostGIS 2.5.0. Fungsi dukungan raster hanya dapat dimuat dalam skema yang sama dengan fungsi inti PostGIS. Jenis pgis_abs dummy telah dihapus dari rutinitas agregat/pengumpulan. Dukungan telah dihapus untuk dukungan drop GEOS < 3.5 dan PostgreSQL < 9.4.

  • Ada peningkatan kinerja untuk menyortir geometri POINT di PostGIS 2.5.0.
  • Indeks pita raster eksternal telah ditambahkan ke ST_BandMetaData. Juga, ada bagian Tips Raster tambahan di Dokumentasi untuk informasi tentang perilaku Raster (misalnya kinerja Out-DB, file terbuka maksimum).
  • Penggunaan GEOS dalam implementasi topologi telah dikurangi di PostGIS 2.5.0.
  • Bug yang membuat MVT dengan nilai properti yang salah di bawah paket paralel telah diperbaiki.
  • Geometri di PostGIS 2.5.0 telah disederhanakan menggunakan ukuran sel petak grid sebelum menghasilkan MVT.
  • Urutan pengurutan BTree sekarang telah didefinisikan pada koleksi geometri KOSONG dan awalan yang sama di PostGIS 2.5.0.
  • Fitur geometri hashable memungkinkan penggunaan langsung dalam tanda tangan CTE di PostGIS 2.5.0.
  • PostGIS 2.5.0 tidak akan menerima titik KOSONG sebagai node topologi.
  • ST_GeometricMedian sekarang menyediakan dukungan untuk bobot titik di PostGIS 2.5.0.
  • Kode duplikat di lwgeom_geos telah dihapus.

Untuk informasi lebih lanjut tentang pembaruan dan perbaikan lainnya di PostGIS 2.5.0, lihat catatan rilis resmi.


Panduan untuk rasterisasi cakupan vektor di PostGIS

Pertanyaan yang sering muncul sejak awal petualangan PostGIS Raster adalah "Bagaimana saya bisa mengubah tabel geometri saya menjadi cakupan raster?" (disini juga). Orang sering menjelaskan cara rasterisasi geometri tunggal menggunakan ST_AsRaster() tetapi saya tidak tahu teks atau tutorial apa pun yang menjelaskan cara mengonversi cakupan vektor lengkap ke raster tunggal atau cakupan raster ubin.

Dalam artikel ini saya akan menjelaskan dua metode untuk rasterisasi cakupan vektor: satu sangat cepat tapi tidak terlalu fleksibel dan satu sangat fleksibel tapi sayangnya agak lambat! Saya akan melakukan rasterisasi tutupan hutan vektor sehingga sejajar sempurna dengan lapisan elevasi raster yang sudah dimuat. Saya akan menggunakan kolom "height" dari tutupan hutan untuk menetapkan nilai ke piksel. Saya akan berasumsi bahwa kedua lapisan berada di SRID yang sama dan hutan hanya menutupi sebagian lapisan elevasi. Lapisan elevasi dibagi dalam 625 ubin berukuran 100x100 piksel dengan total 6 250.000 piksel.


"Cerdas" vektor VS "bodoh" raster!

Mengapa seseorang beralih dari tabel vektor "cerdas" yang diurai, tepat, berorientasi objek, menjadi manusia yang tidak diuraikan, bergerigi, variabel tunggal, lapisan raster "bodoh"? Selama bertahun-tahun saya hanya dapat mengidentifikasi dua alasan bagus untuk melakukannya. Yang pertama adalah memasukkan semua lapisan data Anda ke dalam paradigma analisis tunggal (dalam hal ini raster) untuk menyederhanakan rantai geoproses. Yang kedua adalah karena paradigma raster "bodoh" ini juga masih yang tercepat saat menganalisis data dalam jumlah besar. Pemrosesan tumpukan raster bergantung pada operasi matriks yang sangat sederhana yang umumnya tersedia melalui apa yang disebut orang geo sebagai operasi aljabar peta. Ini umumnya masih lebih cepat daripada aljabar linier yang diperlukan untuk menganalisis cakupan vektor. Bagaimanapun, tugas kita di sini bukanlah untuk memutuskan apakah melakukannya dalam mode vektor lebih baik daripada dalam mode raster. Tugas kita hanyalah menyelesaikan konversi dengan benar…


"Rasterisasi" vs "rendering"

Hal menarik lainnya adalah perbedaan antara rasterizing dan rendering. Rendering adalah konversi model vektor ke gambar untuk tujuan tampilan. Rasterizing adalah konversi dari model vektor ke raster untuk tujuan analisis data. Renderer, seperti MapServer, GeoServer dan Mapnik, selain memadukan banyak lapisan bersama-sama, melambangkan geometri dan melabelinya, umumnya akan menghasilkan anti-aliasing di sepanjang tepi poligon dan menerjemahkan nilai ke dalam warna simbolis. Nilai data asli apa pun hilang dan tidak ada cara untuk menggunakan produk penyaji untuk analisis GIS. Di sisi lain, fungsi rasterizer, seperti yang disediakan oleh GDAL, QGIS, ArcGIS atau PostGIS, akan menghasilkan piksel mentah yang mencoba mewakili permukaan vektor asli seakurat dan seakurat mungkin, menetapkan satu nilai ke setiap piksel (dan hanya nilai-nilai itu) yang terkait dengan geometri asli. Raster yang dihasilkan dari proses rasterisasi merupakan masukan berharga ke dalam rantai analisis geoproses. Hasil dari proses rendering tidak. Kita juga harus mengatakan bahwa meskipun ada beberapa metode untuk meraster cakupan vektor di PostGIS, masih belum ada cara untuk merendernya (kecuali jika Anda menganggap ST_AsJPEG(), ST_AsTIFF() dan ST_AsPNG() sebagai perender yang sangat dasar).


Metode 1.1 – Dasar ST_Union() dan ST_Tile()

Metode rasterisasi pertama yang saya sajikan adalah yang direncanakan sejak awal proyek Raster PostGIS: cukup ubah semua geometri menjadi raster kecil dan gabungkan menjadi satu raster seperti kita menyatukan banyak geometri menggunakan ST_Union(geometry). Kueri lengkap, menyelaraskan raster yang dihasilkan pada cakupan raster elevasi yang ada, akan terlihat seperti ini:


Close-up pada raster yang disatukan
versi tutupan hutan yang dihasilkan
di area "bergerigi" dengan ketinggian yang sama.
Hasil ini adalah raster "besar" yang unik, menggabungkan semua rasterisasi "kecil" dari geometri.

Perhatikan argumen untuk ST_AsRaster(). Yang pertama adalah geometri untuk rasterize. Yang kedua adalah raster referensi dari mana parameter keselarasan dipinjam (sudut piksel x dan y, skala (atau ukuran piksel) dan kemiringan (atau rotasi)). Argumen ketiga adalah tipe piksel dari raster yang diharapkan (32 bit float). Parameter keempat adalah nilai untuk ditetapkan ke piksel. Ini dia kolom 'tinggi' dari tabel tutupan hutan. Parameter terakhir ('-9999') adalah nilai nodata untuk ditetapkan ke piksel yang melapisi area di sekitar setiap geometri raster. Ini adalah varian pertama dari fungsi ST_AsRaster() dalam referensi Raster PostGIS.

Seperti rekan geometrisnya, ST_Union() hanya menggabungkan (menggabungkan) semua raster kecil itu menjadi raster yang unik. Tanpa ST_Union(), kueri akan menghasilkan 2755 raster kecil. Satu untuk setiap geometri.

Perhatikan juga bahwa kami memilih hanya satu raster dari lapisan elevasi sebagai raster referensi ke ST_AsRaster(). Ini karena semua raster dalam tabel ini disejajarkan dengan baik dan kita hanya memerlukan satu set koordinat sudut piksel untuk menyelaraskan semuanya. Kami juga dapat menempatkan kueri ini dengan memilih satu raster langsung ke bagian SELECT:


Kami biasanya tidak ingin menyimpan raster besar ke dalam PostGIS sehingga kami dapat membagi raster yang digabungkan menjadi ubin yang lebih kecil yang memiliki dimensi yang sama dengan cakupan elevasi dengan fungsi ST_Tile():


Ubin tutupan hutan raster, merah, tidak baik
sejajar dengan ubin raster elevasi, berwarna abu-abu.
Perhatikan bahwa kotak adalah ubin 100x100 piksel, bukan piksel.
Ini menghasilkan 48 ubin, sebagian besar berukuran 100x100 piksel. Ada yang hanya berukuran 18x100 piksel dan ada pula yang hanya berukuran 100x46 piksel. Kanan bawah hanya 18x46 piksel.

Terdapat 625 ubin berukuran 100x100 piksel pada cakupan elevasi dan 2755 geometri pada tutupan hutan. Geometri ini hanya mencakup 31 ubin dan raster besar yang dihasilkan mencakup 56 ubin. Kueri untuk membuat raster "besar" membutuhkan waktu 5 detik (terima kasih kepada Bborie Park yang mempercepat ST_Union() dengan faktor besar di PostGIS 2.1) dan kueri untuk sampel ulang/retile hanya membutuhkan 2 detik.

Satu masalah dengan hasil ini adalah bahwa meskipun piksel sejajar dengan lapisan elevasi dan sebagian besar ubin memiliki dimensi yang sama, ubin itu sendiri tidak selaras dengan cakupan ketinggian dan tidak mencakup area yang sama. Metode 1.2 akan memperbaikinya.


Metode 1.2 – ST_Union() dan ST_MapAlgebra()

Untuk menghasilkan cakupan raster yang memiliki footprint yang identik dengan cakupan elevasi, kita harus menggunakan cakupan ini tidak hanya untuk penyelarasan tetapi juga sebagai dasar untuk ubin akhir kita. Triknya adalah "membakar" raster besar menjadi ubin kosong berdasarkan masing-masing ubin elevasi. Untuk itu kita akan menggunakan panggilan ST_MapAlgebra() dua raster (!) yang cukup sederhana:


Dua raster ST_MapAlgebra() fungsi overlay dua raster dan menghitung ekspresi untuk setiap set selaras dua piksel. Hasil dari ekspresi ini menjadi nilai yang ditetapkan untuk setiap piksel dari raster baru.

Karena dua raster tidak selalu selaras, tingkat raster baru bisa sama dengan 1) tingkat penyatuan kedua raster, 2) luasnya area berpotongan 3) luasnya raster pertama atau 4) luasnya dari raster kedua. Di sini, tidak ada dua raster yang terlibat dalam aljabar peta memiliki tingkat yang sama. Karena kita ingin "membakar" raster besar ke dalam ubin yang memiliki tingkat yang sama dengan ubin elevasi, yang berada di urutan kedua dalam daftar argumen, kita harus menentukan bahwa raster baru akan memiliki tingkat yang sama dengan raster "DUA".

Argumen pertama adalah raster ketinggian hutan "besar". Ini adalah satu-satunya baris tabel forestheight_rast.

Argumen kedua adalah petak baru yang dihasilkan dengan ST_MakeEmptyRaster() dan ST_AddBand() dari masing-masing 626 petak elevasi. Kita bisa saja menggunakan ubin asli secara langsung, tetapi karena kita menentukan tingkat yang dihasilkan menjadi "SECOND" dan bahwa nilai nodata hasil dari ST_MapAlgebra() diambil dari raster "FIRST" atau "SECOND" ketika nilai-nilai tersebut ditentukan, maka raster yang dihasilkan akan memiliki 32767 sebagai nilai nodata. Ini adalah nilai nodata dari cakupan raster elevasi. Kita ingin agar nilai nodata hasil sama dengan salah satu tutupan ketinggian hutan, yaitu -9999. Jadi triknya adalah untuk "membangun" ubin baru dari awal dengan ST_MakeEmptyRaster() dengan ubin elevasi asli sebagai referensi penyelarasan dan menambahkannya band dengan ST_AddBand() yang menentukan jenis piksel ('32BF'), nilai awal ('- 9999') dan nilai nodata ('-9999') identik dengan raster ketinggian hutan.

Argumen ketiga adalah ekspresi yang menghitung nilai untuk ditetapkan ke setiap piksel. Nilai piksel dari raster pertama disebut sebagai "[rast1]" dan nilai piksel dari raster kedua disebut sebagai "[rast1]". Anda juga dapat mereferensikan koordinat x piksel dengan "[rast.x]" dan koordinat y dengan "[rast.y]". Ekspresinya adalah ekspresi PostgreSQL normal seperti misalnya "([rast1] + [rast2]) / 2".

Dalam kasus kami, ekspresi hanyalah nilai raster pertama, tinggi hutan, yang ingin kami "bakar" ke dalam ubin. Itu tidak melibatkan nilai dari raster elevasi. Dengan kata lain ubin elevasi hanya digunakan sebagai potongan kertas kosong yang disejajarkan dengan baik di mana kita "mencetak" nilai raster ketinggian hutan.

Argumen keempat adalah tipe piksel ('32BF') yang diharapkan untuk raster yang dihasilkan. Ini sama dengan raster ketinggian hutan.

Argumen terakhir ('SECOND') memberitahu ST_MapAlgebra() untuk menggunakan tingkat raster kedua (ubin elevasi) untuk membangun raster yang dihasilkan.

ST_MapAlgebra() karenanya akan menyalin setiap nilai dari raster ketinggian hutan ke petak kosong baru yang dimensinya didasarkan pada elevasi. Hasil kueri dalam 625 ubin. Ketika sebuah ubin tidak memotong area yang dicakup oleh tutupan hutan, semua pikselnya hanya disetel ke nodata.

Jika raster besar Anda tidak mencakup banyak cakupan raster referensi, Anda dapat mempercepat proses dengan menambahkan indeks spasial ke cakupan referensi (seharusnya sudah ada di sana) dan menahan komputasi ST_MapAlgebra() ke ubin yang berpotongan dengan cakupan vektor :


Namun perlu diingat bahwa kueri ini lebih cepat karena tidak diproses dan karenanya tidak mengembalikan ubin yang tidak menyentuh area tutupan hutan. Jika Anda ingin menghasilkan satu set ubin yang lengkap, identik dalam jumlah dan cakupan elevasi, tetap dengan kueri sebelumnya.


Beberapa kelemahan metode yang menggunakan ST_AsRaster() dan ST_Union()

  • ST_Union dibatasi oleh RAM - Setiap kueri yang melibatkan ST_Union() dibatasi oleh RAM yang tersedia untuk PostgreSQL. Jika raster besar yang dihasilkan dari penyatuan semua geometri raster lebih besar dari RAM yang tersedia, kueri akan gagal. Trik untuk menghindari ini adalah dengan menggabungkan raster kecil bukan menjadi raster unik yang besar, tetapi ke dalam kelompok raster yang lebih kecil yang berpotongan dengan ubin dari raster referensi. Metode 1.3 akan menunjukkan bagaimana melakukannya.

Ini karena ST_AsRaster() meraster hanya satu geometri pada satu waktu tanpa mempertimbangkan geometri lain yang berpotongan dengan piksel. Jika Anda mempertimbangkan semua geometri lapisan saat menetapkan nilai, Anda mungkin ingin menetapkan metrik lain ke piksel seperti jumlah geometri yang berpotongan dengan piksel, panjang total semua polyline yang berpotongan dengan piksel, nilai yang terkait dengan poligon terkecil yang berpotongan dengan piksel, dll.

Metode ini aman untuk RAM karena tidak pernah menghasilkan raster "besar" yang lebih besar dari area yang dicakup oleh satu ubin dari raster referensi. Ini sedikit lebih lambat daripada kueri pertama metode 1.2 karena menyatukan beberapa raster berkali-kali ketika mereka menyentuh banyak ubin. Ini juga menghasilkan 625 ubin seperti cakupan ketinggian.


Kueri pertama dalam pernyataan WITH (forestrast) rasterisasi geometri, gabungkan mereka dengan kelompok yang memotong ubin raster referensi dan bakar masing-masing ke ubin baru seperti yang terlihat sebelumnya. Ini dilakukan dengan penambahan klausa WHERE yang membatasi operasi pada geometri yang berpotongan dengan ubin dan klausa GROUP BY yang memastikan bahwa ST_Union() hanya menggabungkan raster kecil "milik" ke ubin yang sama.

Namun, klausa WHERE menyebabkan luasnya terbatas pada area yang dicakup oleh tutupan hutan. Bagian pertama ini saja akan mengembalikan hanya 32 ubin. Bagian kedua dari kueri memastikan kita mendapatkan 593 ubin yang tersisa. Ini menggunakan LEFT OUTER JOIN untuk memastikan satu baris dikembalikan untuk setiap 625 ubin dari cakupan raster referensi. Ketika penghapusan cakupan raster referensi cocok dengan salah satu dari 32 ubin, ubin ini dikembalikan. Jika tidak, ubin kosong baru akan dikembalikan. Anda dapat melewatkan bagian ini jika lapisan vektor sumber Anda mencakup seluruh area raster referensi atau jika Anda ingin membatasi area raster ke salah satu lapisan vektor.


Metode 2 – Pengaya PostGIS ST_ExtractToRaster()

Seperti yang dikatakan sebelumnya, ST_AsRaster() cukup terbatas dalam hal jenis nilai yang dapat diberikannya ke piksel. Tidak begitu banyak nilai yang dapat diekstraksi dari satu poligon: nilai di pusat, proporsi area piksel yang dicakup, nilai yang dibobot oleh proporsi ini, panjang bagian berpotongan dari polyline yang diraster. ST_AsRaster() namun, karena didasarkan pada GDAL, hanya mengimplementasikan yang pertama.

Lebih jauh, lebih banyak metrik dapat dibayangkan jika nilai yang ditetapkan untuk setiap piksel tidak hanya berasal dari satu geometri tetapi dari agregasi semua geometri (atau nilai yang terkait dengannya) dari cakupan vektor yang memotong pusat massa atau permukaan piksel. . Kita mungkin, misalnya, ingin menghitung jumlah geometri yang berpotongan dengan piksel. Kita mungkin tertarik dengan nilai poligon yang menutupi bagian terbesar dari piksel atau polyline yang memiliki panjang terpanjang di dalam piksel tersebut. Kita mungkin ingin menggabungkan geometri yang memiliki nilai yang sama sebelum menghitung metrik. Saya dapat mengidentifikasi hampir 76 metrik berbeda yang dapat diekstraksi dari cakupan titik, garis poli, dan poligon.

Oleh karena itu, kami membutuhkan fungsi yang mampu mengekstrak metrik dari cakupan vektor secara keseluruhan dan memungkinkan kami untuk menerapkan metode ekstraksi baru dengan mudah. Fungsi PostGIS Add-ons ST_ExtractToRaster() ditulis dengan tujuan ini.

Pengaya PostGIS adalah kumpulan sekitar 15 fungsi tertulis komunitas PL/pgSQL murni yang membantu menulis kueri PostGIS tingkat lanjut. Salah satu yang paling berguna dari fungsi ini adalah ST_ExtractToRaster().

Kueri menggunakan ST_ExtractToRaster(), mengembalikan kumpulan ubin yang sama seperti metode 1.3 dan juga tidak mengalami keterbatasan RAM akan terlihat seperti ini:


Komentar pertama dan sangat penting: kueri ini membutuhkan waktu sekitar 200 detik! Ini sekitar 16 kali lebih banyak dari kueri aman RAM yang setara dengan metode 1.3! Ini karena ST_ExtractToRaster() melakukan lebih dari ST_AsRaster(). Ini tidak hanya mempertimbangkan seluruh cakupan, ia dapat menghitung hal-hal yang sangat berbeda dari cakupan ini. Jelas tidak layak menggunakan ST_ExtractToRaster() jika yang Anda inginkan adalah nilai geometri yang memotong pusat piksel. Yang menarik untuk fungsi ini adalah metode lain yang tersedia.

Perhatikan argumen terakhir untuk ST_ExtractToRaster(): 'MEAN_OF_VALUES_AT_PIXEL_ CENTROID'. Ini adalah metode yang digunakan untuk mengekstrak nilai piksel. Lima belas (15) metode ini telah diimplementasikan dengan ST_ExtractToRaster() hingga sekarang. Mereka tercantum di bawah ini dengan deskripsi singkat.

Metode 'MEAN_OF_VALUES_AT_PIXEL_CENTROID' mengembalikan cakupan raster yang nilainya identik dengan cakupan raster yang dihasilkan dengan metode sebelumnya. Namun, sebagian besar metode lain akan mengembalikan raster yang sangat berbeda…

Argumen lain untuk ST_ExtractToRaster() cukup sepele: yang pertama adalah raster tempat nilai diekstraksi. Ini adalah praktik yang baik untuk melewatkan pita raster kosong baru yang memiliki jenis piksel, nilai awal, dan nilai nodata yang tepat dan perataan mana yang didasarkan pada ubin dari raster referensi. Ini identik dengan apa yang kami lakukan di 1.2 dan 1.3. Argumen kedua adalah skema tabel vektor untuk rasterisasi ('publik'). Yang ketiga dan keempat adalah nama tabel ('tutupan hutan') dan nama kolom ('geom') yang berisi geometri untuk rasterisasi. Argumen kelima adalah kolom yang berisi nilai yang akan digunakan dalam perhitungan nilai baru bila diperlukan ('tinggi'). Ketika perhitungan hanya melibatkan geometri (misalnya COUNT_OF_VALUES_AT_PIXEL_ CENTROID atau SUM_OF_LENGTHS), argumen ini tidak diperlukan.

Kueri akan mengembalikan raster baru untuk setiap raster di tabel elevasi, dalam hal ini 625.

  • COUNT_OF_VALUES_AT_PIXEL_CENTROID: Jumlah geometri yang berpotongan dengan pusat piksel.
  • MEAN_OF_VALUES_AT_PIXEL_CENTROID: Rata-rata dari semua nilai yang berpotongan dengan pusat piksel.
  • COUNT_OF_POLYGONS: Jumlah poligon atau multipoligon yang berpotongan dengan permukaan piksel.
  • COUNT_OF_LINESTRINGS: Jumlah linestrings atau multilinestrings berpotongan dengan permukaan piksel.
  • COUNT_OF_POINTS: Jumlah titik atau multipoint yang berpotongan dengan permukaan piksel.
  • COUNT_OF_GEOMETRIES: Jumlah geometri (apa pun itu) yang berpotongan dengan permukaan piksel.
  • VALUE_OF_BIGGEST: Nilai yang terkait dengan poligon yang menutupi area terbesar yang berpotongan dengan permukaan piksel.
  • VALUE_OF_MERGED_BIGGEST: Nilai yang terkait dengan poligon yang menutupi area terbesar yang berpotongan dengan permukaan piksel. Poligon dengan nilai identik digabungkan sebelum menghitung luas permukaan.
  • VALUE_OF_MERGED_SMALLEST: Nilai yang terkait dengan poligon yang mencakup area terkecil dalam piksel. Poligon dengan nilai identik digabungkan sebelum menghitung luas permukaan.
  • MIN_AREA: Area geometri yang menempati bagian terkecil dari permukaan piksel.
  • SUM_OF_AREAS: Jumlahkan luas semua poligon yang berpotongan dengan permukaan piksel.
  • SUM_OF_LENGTHS: Jumlah panjang semua linestring yang berpotongan dengan permukaan piksel.
  • PROPORTION_OF_COVERED_AREA: Proporsi, antara 0,0 dan 1,0, dari permukaan piksel yang dicakup oleh gabungan semua poligon yang berpotongan dengan permukaan piksel.
  • AREA_WEIGHTED_MEAN_OF_VALUES: Rata-rata dari semua nilai poligon yang diberi bobot oleh area yang ditempati relatif terhadap piksel yang sedang diproses. Jumlah tertimbang dibagi dengan maksimum antara area berpotongan geometri dan jumlah semua area geometri tertimbang. Artinya, jika piksel yang diproses tidak sepenuhnya tertutup oleh poligon, nilainya dikalikan dengan proporsi area penutup. Misalnya, jika poligon hanya mencakup 25% permukaan piksel dan tidak ada poligon lain yang menutupi permukaan, hanya 25% nilai yang terkait dengan poligon penutup yang ditetapkan ke piksel. Ini umumnya perilaku favorit.
  • AREA_WEIGHTED_MEAN_OF_VALUES_2: Rata-rata dari semua nilai poligon yang diberi bobot oleh area yang ditempatinya relatif terhadap piksel yang sedang diproses. Jumlah tertimbang dibagi dengan jumlah semua area geometri tertimbang. Itu berarti jika piksel yang diproses tidak sepenuhnya tertutup oleh poligon, nilai pembobotan penuh diberikan ke piksel. Misalnya, bahkan jika poligon hanya mencakup 25% permukaan piksel, 100% nilainya ditetapkan ke piksel.

Ingin menghitung beberapa metrik esoterik lainnya dengan ST_ExtracToRaster()? Secara internal fungsi tersebut menggunakan versi callback ST_MapAlgebra() yang memanggil salah satu dari dua callback yang telah ditentukan sebelumnya bergantung pada apakah nilainya dihitung untuk pusat piksel atau jika nilainya dihitung menggunakan seluruh permukaan piksel. Fungsi-fungsi tersebut diberi nama ST_ExtractPixelCentroidValue4ma() dan ST_ExtractPixelValue4ma(). Mereka memenuhi kriteria untuk fungsi callback ST_MapAlgebra(). Mereka mengambil tiga argumen yang mendefinisikan nilai piksel input (bisa banyak), posisi piksel dalam raster dan beberapa parameter tambahan bila diperlukan. Untuk membangun kueri untuk setiap piksel, kedua fungsi mengharapkan parameter tambahan: parameter penyelarasan raster yang nilainya sedang dihitung dan parameter kolom geometri yang nilainya diekstraksi. Callback kemudian mendefinisikan serangkaian metode ekstraksi.

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
Poligon ast_polygon geometry(polygon)
Garis ast_line geometry(linestring)
Titik 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
Sampel 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:

  • mengandung
  • containsproperly
  • meliputi
  • coveredby
  • crosses
  • disjoint
  • jauh
  • berpotongan
  • di dekat
  • overlaps
  • touches
  • di dalam

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.

  • NS menguasai branch has the latest release
  • NS 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:


Tonton videonya: Intersection Geometry. PostGIS (September 2021).