Topik ini menjelaskan detail dan penggunaan model geometri.
Pengenalan
Ikhtisar
Konsorsium Open Geospatial (OGC) mengembangkan standar Simple Features Access (SFA) untuk menyediakan model data geospasial. Standar ini mendefinisikan tipe spasial dasar dari Geometri dan operasi yang memanipulasi serta mentransformasi nilai geometri untuk melakukan tugas analisis spasial.
GanosBase Geometry adalah ekstensi mesin spatio-temporal untuk PostgreSQL (PolarDB for PostgreSQL (Kompatibel dengan Oracle)). GanosBase Geometry menggunakan SFA yang dikembangkan oleh OGC. Ini mendukung tipe data geometri dan geografi untuk menggambarkan objek geometris, seperti titik, garis, dan bidang pada bidang dan permukaan.
Fitur
GanosBase Geometry mendukung berbagai metode untuk membangun, mengakses, mengedit, memproses, mengumpulkan, dan mengekspor objek spasial. Ini juga mendukung kueri relasional dan pengaturan referensi linier untuk objek spasial.
GanosBase Geometry kompatibel dengan berbagai format data untuk input langsung, seperti WKT, WKB, EKWT, EWKB, KML, GML, GeoHash, dan Geojson. Anda juga dapat menggunakan alat lain untuk mengimpor data dalam format lain seperti Esri Shapefiles.
Skenario
Tipe data geometri dapat digunakan untuk menyimpan dan menganalisis objek geometris:
Pembuatan dan visualisasi peta
Visualisasi peta menampilkan distribusi, tren, dan hubungan data dalam ruang geografis. Visualisasi peta menandai data seperti titik, garis, dan bidang, serta menggunakan elemen seperti proyeksi peta, warna, dan simbol untuk menampilkan distribusi data dalam ruang geografis. Ini membantu Anda dalam pembuatan dan visualisasi peta. Tipe data geometri dapat digunakan untuk merepresentasikan berbagai fitur pada peta, seperti jalan, sungai, dan bangunan.
Layanan lokasi
Anda dapat melakukan kueri spasial, agregasi, dan analisis data lokasi untuk menemukan lokasi terbaik, menilai risiko, atau menghitung jarak antara dua titik. Tipe data geometri dapat menggambarkan objek geo titik dan melakukan pemrosesan spasial pada objek geo titik. Ini dapat memberikan dukungan untuk layanan lokasi.
Kueri hubungan spasial
Kueri hubungan spasial dapat digunakan dalam berbagai skenario, seperti penambangan data spasial dan perencanaan perkotaan. Anda dapat dengan cepat menemukan entitas spasial yang memenuhi kondisi tertentu dengan menjalankan kueri hubungan spasial. Ini dapat memberikan dukungan untuk proses pengambilan keputusan Anda. Tipe data geometri memungkinkan Anda mengidentifikasi hubungan spasial antara beberapa objek geometris. Misalnya, Anda dapat mengidentifikasi apakah dua objek berpotongan atau bersinggungan satu sama lain.
Analisis dan komputasi spasial
Analisis dan komputasi spasial dapat digunakan dalam berbagai skenario pengukuran, seperti menghitung luas bangunan dan jarak antara dua kota. Tipe data geometri mendukung berbagai jenis analisis dan perhitungan spasial, seperti menghitung luas, panjang, jarak, dan pusat massa.
Komponen
Ikhtisar model geometri
Model geometri membentuk bentuk dalam sistem koordinat 2 dimensi atau 3 dimensi. Ukuran dan lokasi bentuk ditentukan oleh koordinat mereka. Setiap koordinat memiliki nilai koordinat x dan y, dan mungkin berisi nilai koordinat z dan m. Nilai koordinat z sering digunakan untuk merepresentasikan elevasi. Koordinat m berisi nilai ukuran, yang mungkin merepresentasikan waktu atau jarak. Jika nilai koordinat z atau m ada dalam nilai geometri, mereka harus didefinisikan untuk setiap titik dalam geometri. Jika geometri memiliki nilai koordinat z atau m, dimensi koordinatnya adalah 3D. Jika geometri memiliki baik nilai koordinat z maupun m, dimensi koordinatnya adalah 4D.
Sistem referensi spasial
Sistem referensi spasial (SRS) mendefinisikan bagaimana mengaitkan objek Geometri dengan lokasi tertentu di permukaan Bumi.
GanosBase menggunakan bilangan bulat sebagai SRID untuk merujuk definisi SRS. Objek Scene dikaitkan dengan SRS dengan menggunakan nilai SRID miliknya sendiri.
Untuk informasi lebih lanjut, lihat Referensi Spasial.
Format untuk penggunaan eksternal
Spesifikasi SFA mendefinisikan dua format untuk merepresentasikan nilai geometri untuk penggunaan eksternal:
Well-Known Text (WKT) menyediakan representasi teks standar untuk data spasial.
Well-Known Binary (WKB) menyediakan representasi biner portabel, presisi penuh untuk data spasial sebagai data biner.
Baik WKT maupun WKB mencakup informasi tentang tipe objek dan koordinat yang mendefinisikannya, tetapi tidak termasuk SRID terkait. Data non-biner tidak didukung.
GanosBase menyediakan format EKWT dan EKWB di atas format WKT dan WKB untuk mendukung data 3DZ, 3DM, dan 4D serta penyematan informasi SRID.
Format EKWT atau EKWB adalah superset dari format WKT atau WKB. File valid dari format WKT atau WKB adalah file valid dari format EKWT atau EKWB.
Tipe data geometri
Tipe atomik
Model
Deskripsi
Contoh
Point
Geometri 0-dimensi yang merepresentasikan lokasi tunggal dalam ruang koordinat.
POINT (1 2) * POINT Z (1 2 3)
POINT ZM (1 2 3 4)
LineString
Garis 1-dimensi yang dibentuk oleh urutan segmen garis yang berkelanjutan. Setiap segmen garis didefinisikan oleh dua titik, dengan titik akhir satu segmen membentuk titik awal segmen berikutnya. LineStrings dapat berpotongan sendiri.
LINESTRING (1 2, 3 4, 5 6)
Polygon
Wilayah planar 2-dimensi, dibatasi oleh batas luar (shell) dan nol atau lebih batas dalam (lubang). Setiap batas adalah LinearRing.
POLYGON ((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))
Tipe parameter
Model
Deskripsi
Contoh
EllipticalString
Busur elips.
ELLIPTICALSTRING(-2 0,2 0,0 0,0,0,0,2,0.5)
Bezier3Curve
Kurva Bezier orde ketiga yang ditentukan oleh empat titik.
BEZIER3CURVE(1 1, 2 2, 3 2, 3 1)
Tipe koleksi
Model
Deskripsi
Contoh
MultiPoint
Koleksi Points.
MULTIPOINT ( (0 0), (1 2) )
MultiLineString
Koleksi LineStrings.
MULTILINESTRING ( (0 0,1 1,1 2), (2 3,3 2,5 4) )
MultiPolygon
Koleksi Polygon yang tidak tumpang tindih dan tidak berdekatan. Polygon dalam koleksi hanya boleh menyentuh pada sejumlah titik terbatas.
MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5)), ((6 5, 9 1, 6 1, 6 5)))
GeometryCollection
Koleksi heterogen geometri.
GEOMETRYCOLLECTION ( POINT(2 3), LINESTRING(2 3, 3 4))
CompoundCurve
Objek garis majemuk yang dapat berisi garis, busur elips, dan kurva Bezier. Titik akhir setiap komponen (kecuali yang terakhir) harus bertepatan dengan titik awal komponen berikutnya.
COMPOUNDCURVE((1 0,2 0),ELLIPTICALSTRING(2 0 ,4 0, 3 0 ,1,0,0,1,0.5))
COMPOUNDCURVE((1 2,2 0),BEZIER3CURVE(2 0,20 20 ,30 10,10 10))
CurvePolygon
Objek permukaan majemuk yang berisi kurva. Objek dalam CurvePolygon harus tertutup.
CURVEPOLYGON(ELLIPTICALSTRING(2 0,2 0,0 0,0,0,0,2,0.5),CIRCULARSTRING(-0.5 0,0.5 0,-0.5 0))
CURVEPOLYGON(BEZIER3CURVE(1 1, 2 2, 3 1, 1 1),CIRCULARSTRING(1.7 1.2,1.9 1.2,1.7 1.2))
Tampilan kolom data spasial
Dalam GanosBase, tampilan geometry_columns membaca semua kolom geometri dari tabel katalog sistem database. Tampilan ini mengikuti Spesifikasi Fitur Sederhana untuk standar SQL yang didefinisikan oleh OGC.
Tampilan kolom data spasial berisi kolom-kolom berikut:
Kolom | Tipe | Deskripsi |
f_table_catalog | varchar(256) | Nama database. Nilai ini tetap sebagai postgres. |
f_table_schema | varchar(256) | Skema tabel. |
f_table_name | varchar(256) | Nama tabel. |
f_geometry_column | varchar(256) | Nama kolom geometri dalam tabel. |
coord_dimension | integer | Dimensi kolom geometri. Nilai valid: 2,3, dan 4. |
srid | integer | SRID kolom geometri, yang merupakan kunci asing yang merujuk ke tabel spatial_ref_sys. |
type | varchar(30) | Tipe objek geometri. Nilainya harus salah satu dari tipe data OGC standar. Nilai GEOMETRY menunjukkan tipe data campuran. |
Anda dapat menjalankan pernyataan berikut untuk menanyakan semua kolom data geometri dalam database saat ini:
SELECT * FROM geometry_columns;Indeks
Indeks spasial memungkinkan GanosBase menghindari pemindaian urutan global basis data saat memproses dataset spasial besar. Indeks spasial mengorganisasi data dalam struktur pohon yang dapat dilintasi dengan cepat untuk menemukan catatan tertentu.
GanosBase menyediakan jenis indeks spasial berikut untuk data spasial:
Indeks | Ikhtisar | Fitur |
GiST (Generalized Search Tree) | GiST adalah pohon pencarian seimbang yang biasa digunakan untuk pengindeksan spasial. Ini dapat memberikan kinerja kueri tinggi. | Indeks GiST memungkinkan Anda mendefinisikan aturan untuk mendistribusikan data dari tipe apa pun pada pohon seimbang. Anda juga dapat mendefinisikan metode untuk mengakses data. |
BRIN (Block Range Index) | Indeks BRIN menyimpan satu set catatan tabel spasial, yang disebut rentang blok. Saat Anda menjalankan kueri, rentang blok dipindai untuk hasil. |
|
SP-GiST (Space-Partitioned Generalized Search Tree) | SP-GiST adalah bentuk generik pengindeksan untuk tipe data multi-dimensi yang mendukung pohon pencarian partisi, seperti quad-trees, k-d trees, dan radix trees. |
|
Pendahuluan Cepat
Ikhtisar
Bagian ini menjelaskan cara menggunakan mesin GanosBase Geometry, termasuk pembuatan ekstensi, pembuatan tabel, impor data, pembuatan indeks, analisis dan pengukuran spasial, serta identifikasi hubungan spasial.
Sintaksis
Buat ekstensi.
-- Buat ekstensi geometri. CREATE extension ganos_geometry cascade;CatatanBuat ekstensi di skema publik untuk menghindari masalah izin.
CREATE extension ganos_geometry WITH schema public cascade;Buat tabel geometri.
-- Metode 1: Buat tabel yang berisi bidang geometri. CREATE TABLE ROADS ( ID int4, ROAD_NAME varchar(25), geom geometry(LINESTRING,3857) ); -- Metode 2: Buat tabel reguler lalu tambahkan bidang geometri ke tabel. CREATE TABLE ROADS (ID int4, ROAD_NAME varchar(25)); SELECT AddGeometryColumn( 'roads', 'geom', 3857, 'LINESTRING', 2);Tambahkan kendala geometri.
ALTER TABLE ROADS ADD CONSTRAINT geometry_valid_check CHECK (ST_IsValid(geom));Impor data geometri.
INSERT INTO roads (id, geom, road_name) VALUES (1,ST_GeomFromText('LINESTRING(191232 243118,191108 243242)',3857),'Jalan Lingkar Utara'); INSERT INTO roads (id, geom, road_name) VALUES (2,ST_GeomFromText('LINESTRING(189141 244158,189265 244817)',3857),'Jalan Lingkar Timur'); INSERT INTO roads (id, geom, road_name) VALUES (3,ST_GeomFromText('LINESTRING(192783 228138,192612 229814)',3857),'Jalan Lingkar Selatan'); INSERT INTO roads (id, geom, road_name) VALUES (4,ST_GeomFromText('LINESTRING(189412 252431,189631 259122)',3857),'Jalan Lingkar Barat'); INSERT INTO roads (id, geom, road_name) VALUES (5,ST_GeomFromText('LINESTRING(190131 224148,190871 228134)',3857),'Jalan Chang'an Timur'); INSERT INTO roads (id, geom, road_name) VALUES (6,ST_GeomFromText('LINESTRING(198231 263418,198213 268322)',3857),'Jalan Chang'an Barat');Kueri informasi objek geometri.
SELECT id, ST_AsText(geom) AS geom, road_name FROM roads; -------------------------------- id | geom| road_name --------+-----------------------------------------+----------- 1 | LINESTRING(191232 243118,191108 243242) | Jalan Lingkar Utara 2 | LINESTRING(189141 244158,189265 244817) | Jalan Lingkar Timur 3 | LINESTRING(192783 228138,192612 229814) | Jalan Lingkar Selatan 4 | LINESTRING(189412 252431,189631 259122) | Jalan Lingkar Barat 5 | LINESTRING(190131 224148,190871 228134) | Jalan Chang'an Timur 6 | LINESTRING(198231 263418,198213 268322) | Jalan Chang'an Barat (6 baris)Buat indeks.
-- Buat indeks GiST. CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd); VACUUM ANALYZE [table_name] [(column_name)]; -- Contoh: Create INDEX sp_geom_index ON ROADS USING GIST(geom); VACUUM ANALYZE ROADS (geom); -- Buat indeks BRIN. CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geometryfield] ); CREATE INDEX [indexname] ON [tablename] USING BRIN ([geometryfield] brin_geometry_inclusion_ops_3d); CREATE INDEX [indexname] ON [tablename] USING BRIN ([geometryfield] brin_geometry_inclusion_ops_4d); -- Buat indeks BRIN dengan ukuran blok yang ditentukan. CREATE INDEX [indexname] ON [tablename] USING BRIN ( [geometryfield] ) WITH (pages_per_range = [number]);Ukur dan analisis data spasial.
--Buat Tabel bc_roads: Kolom | Tipe | Deskripsi ------------+-------------------+------------------- gid | integer | ID Unik name| character varying | Nama Jalan the_geom| geometry | Lokasi Geometri (Linestring) --Buat tabel bc_municipality: Kolom | Tipe | Deskripsi -----------+-------------------+------------------- gid| integer | ID Unik code | integer | ID Unik name | character varying | Nama Kota / Kota Kecil the_geom | geometry | Lokasi Geometri (Polygon) -- Hitung panjang. SELECT sum(ST_Length(the_geom))/1000 AS km_roads FROM bc_roads; km_roads ------------------ 70842.1243039643 (1 baris) -- Hitung luas. SELECT ST_Area(the_geom)/10000 AS hectares FROM bc_municipality WHERE name = 'PRINCE GEORGE'; hectares ------------------ 32657.9103824927 (1 baris)Identifikasi hubungan spasial.
--ST_Contains SELECT m.name, sum(ST_Length(r.the_geom))/1000 as roads_km FROM bc_roads AS r, bc_municipality AS m WHERE ST_Contains(m.the_geom,r.the_geom) GROUP BY m.name ORDER BY roads_km; name| roads_km ----------------------------+------------------ SURREY | 1539.47553551242 VANCOUVER | 1450.33093486576 LANGLEY DISTRICT| 833.793392535662 BURNABY | 773.769091404338 PRINCE GEORGE | 694.37554369147 ... --ST_Covers, lingkaran menutupi lingkaran SELECT ST_Covers(smallc,smallc) As smallinsmall, ST_Covers(smallc, bigc) As smallcoversbig, ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior, ST_Contains(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc, ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo; --Hasil smallinsmall | smallcoversbig | bigcoversexterior | bigcontainsexterior --------------+----------------+-------------------+--------------------- t| f | t | f (1 baris) --ST_Disjoint SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry); st_disjoint --------------- t (1 baris) SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry); st_disjoint --------------- f (1 baris) --ST_Overlaps SELECT ST_Overlaps(a,b) As a_overlap_b, ST_Crosses(a,b) As a_crosses_b, ST_Intersects(a, b) As a_intersects_b, ST_Contains(b,a) As b_contains_a FROM (SELECT ST_GeomFromText('POINT(1 0.5)') As a, ST_GeomFromText('LINESTRING(1 0, 1 1, 3 5)') As b) As foo a_overlap_b | a_crosses_b | a_intersects_b | b_contains_a ------------+-------------+----------------+-------------- f | f | t | t --ST_Relate SELECT ST_Relate(ST_GeometryFromText('POINT(1 2)'), ST_Buffer(ST_GeometryFromText('POINT(1 2)'),2), '0FFFFF212'); st_relate ----------- t --ST_Touches SELECT ST_Touches('LINESTRING(0 0, 1 1, 0 2)'::geometry, 'POINT(1 1)'::geometry); st_touches ------------ f (1 baris) SELECT ST_Touches('LINESTRING(0 0, 1 1, 0 2)'::geometry, 'POINT(0 2)'::geometry); st_touches ------------ t (1 baris) --ST_Within SELECT ST_Within(smallc,smallc) As smallinsmall, ST_Within(smallc, bigc) As smallinbig, ST_Within(bigc,smallc) As biginsmall, ST_Within(ST_Union(smallc, bigc), bigc) as unioninbig, ST_Within(bigc, ST_Union(smallc, bigc)) as biginunion, ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion FROM ( SELECT ST_Buffer(ST_GeomFromText('POINT(50 50)'), 20) As smallc, ST_Buffer(ST_GeomFromText('POINT(50 50)'), 40) As bigc) As foo; --Hasil smallinsmall | smallinbig | biginsmall | unioninbig | biginunion | bigisunion --------------+------------+------------+------------+------------+------------ t| t | f | t | t | t (1 baris)Akses objek geometri.
SELECT ST_IsSimple(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))')); st_issimple ------------- t (1 baris) SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)')); st_issimple ------------- f (1 baris) -- Kueri kota terbesar yang memiliki bundaran lalu lintas di medan. SELECT gid, name, ST_Area(the_geom) AS area FROM bc_municipality WHERE ST_NRings(the_geom) > 1 ORDER BY area DESC LIMIT 1; gid | name | area -----+--------------+------------------ 12 | Anning | 257374619.430216 (1 baris)Hapus ekstensi (opsional).
-- Hapus ekstensi geometri. Drop extension ganos_geometry cascade;
Referensi SQL
Untuk informasi lebih lanjut, lihat Referensi SQL Geometry.