Menyimpan permukaan GML di PostGIS

9

Saya menggunakan PostGIS 2.0.0 dan ingin menyimpan Permukaan GML dengan cara yang memungkinkan menghitung persimpangan antara permukaan itu dan berbagai titik dan garis. Dalam kasus saya, Surface akan memiliki satu PolygonPatch tanpa cincin interior dan cincin eksterior yang mungkin berupa LineStringSegment, Geodesic, Arc, atau Circle. Jaraknya bisa dalam urutan puluhan hingga ratusan mil. Saya melihat PostGIS memiliki CIRCULARSTRINGdan CURVEPOLYGON, yang tampaknya merupakan cara yang baik untuk menyimpan Arc, kecuali bahwa mereka tidak didukung oleh geographytipenya saja geometry. Apa cara terbaik untuk menyimpan ini? (Saya cukup baru di PostGIS dan GIS secara umum, jadi sangat mungkin saya kehilangan sesuatu yang jelas.)

EM0
sumber
Anda dapat menyimpan GML di postgis apa adanya. postgis.refractions.net/documentation/manual-svn/…
Mapperz
Beberapa penjelasan di sini tentang geometri dan tipe geografi PostGIS postgis.refractions.net/docs/…
canisrufus

Jawaban:

4

ST_GeomFromGML

Anda dapat menyimpan fitur GML Anda sebagai datatype PostGIS Geometry dengan menggunakan fungsi ST_GeomFromGML yang akan mengubah GML Anda ke datatype geometri. FYI: Ada fungsi serupa untuk KML, WKT, dan sebagainya.

lakukan sesuatu seperti:

INSERT into myTable (mygeomField) values (ST_GeomFromGML('
    <gml:LineString srsName="EPSG:4269">
        <gml:coordinates>
            -71.16028,42.258729 -71.160837,42.259112 -71.161143,42.25932
        </gml:coordinates>
    </gml:LineString>'));

Setelah Anda memilikinya di bidang geometri, Anda dapat melakukan semua persimpangan yang menyenangkan dan hal-hal yang ingin Anda lakukan di PostGIS

Kemudian Anda dapat memuntahkan kembali hasil Anda dalam format GML menggunakan ST_AsGML

EDIT # 1 Saya yakin Anda sedang mencari:

http://postgis.net/docs/ST_Distance_Sphere.html

http://postgis.net/docs/ST_Distance_Spheroid.html

EDIT # 2

Saya menggunakan "POSTGIS =" 1.5.2 "(versi lebih tua dari Anda) dan pernyataan berikut berfungsi dengan baik:

select ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)')

Anda harus menggunakan kombinasi fungsi untuk mendapatkan yang Anda butuhkan.

distance_spheroid tidak mendukung CIRCULARSTRING karena mengambil tipe data geometri.

Harap tambahkan EDIT ke pertanyaan awal Anda dengan sepotong sampel GML yang bermasalah dengan Anda dan saya akan menuliskan pernyataan untuk Anda.

CaptDragon
sumber
Terima kasih, tetapi mengimpor dari GML sebenarnya bukan masalah inti. Pertanyaan utamanya adalah bagaimana menyimpan data dengan cara yang memungkinkan perhitungan yang akurat. Seperti yang saya pahami, tipe geometri tidak akan bekerja dengan baik untuk itu, karena didasarkan pada bidang, dan tipe geografi tidak mendukung kurva.
EM0
@ EM: Periksa EDIT # 1 saya
CaptDragon
Terima kasih, sudah mencobanya, tetapi sayangnya mereka tidak mendukung CIRCULARSTRINGs.
EM0
@ EM: Periksa EDIT # 2 saya
CaptDragon
Ya, pernyataan untuk membuat CIRCULARSTRING berfungsi, tetapi perhitungan jarak pada string itu menggunakan pesawat, seperti yang saya mengerti, karena ini bertipe "geometri". Bagaimanapun, saya akan mencoba menyimpan data dalam dua cara - nilai yang tepat sebagai CIRCULARSTRING (geometri) dan nilai perkiraan (geografi) yang dihasilkan menggunakan ST_CurveToLine.
EM0
2

Pada akhirnya saya menyerah untuk menyimpan busur atau lingkaran "tepat". Saat mengimpor GML Arc (yang didefinisikan oleh 3 poin pada arc) Saya sementara membuat geometri CIRCULARSTRING, lalu mengonversinya menjadi geografi, seperti ini:

ST_RemoveRepeatedPoints(ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING(...)', 4326)))::geography

Saat mengimpor GML ArcByCenterPoint (yang ditentukan oleh titik pusat, jari-jari dan sudut mulai dan ujung) saya memperkirakan secara langsung dengan memproyeksikan titik pada interval 1 derajat dari sudut mulai ke sudut ujung. Ini dilakukan pada sphere, bukan spheroid, sehingga tidak sepenuhnya akurat, tetapi ada tiket PostGIS untuk mengimplementasikan proyeksi azimuth dan point untuk tipe geografi. Sama untuk lingkaran.

EM0
sumber