GML yüzeyini PostGIS'te depolama


9

PostGIS 2.0.0 kullanıyorum ve bu yüzey ile çeşitli noktalar ve çizgiler arasındaki kavşakların hesaplanmasına izin verecek şekilde bir GML Yüzey saklamak istiyorum. Benim durumumda, Yüzeyde iç halkaları olmayan bir PolygonPatch ve bir LineStringSegment, bir Geodesic, bir Arc veya Circle olabilecek bir dış halka olacak. Mesafeler onlarca ila yüzlerce mil arasında olabilir. Ben PostGIS olduğunu görüyoruz CIRCULARSTRINGve CURVEPOLYGONonlar tarafından desteklenen değiliz dışında bir Arc depolamak için iyi bir yol gibi görünüyor, hangi geographysadece, tip geometry. Bunu saklamanın en iyi yolu ne olurdu? (Genel olarak PostGIS ve GIS için oldukça yeniyim, bu yüzden bariz bir şeyi kaçırmam tamamen mümkündür.)


GML'yi postgis'te olduğu gibi saklayabilirsiniz. postgis.refractions.net/documentation/manual-svn/…
Mapperz

PostGIS'in geometrisi ve coğrafya türleri hakkında bazı açıklamalar postgis.refractions.net/docs/…
canisrufus

Yanıtlar:


4

ST_GeomFromGML

GML'nizi geometri veri tipine dönüştürecek ST_GeomFromGML işlevini kullanarak GML özelliklerinizi PostGIS Geometri veri türü olarak saklayabilirsiniz . FYI: KML, WKT, vb. İçin benzer işlevler vardır.

sadece şöyle bir şey yapın:

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>'));

Geometri alanına girdikten sonra, PostGIS'de yapmak istediğiniz tüm eğlenceli kesişimleri ve işleri yapabilirsiniz

Ardından ST_AsGML'yi kullanarak sonucunuzu GML biçiminde geri gönderebilirsiniz

EDIT # 1 Aradığınızı sanıyorum:

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

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

DÜZENLEME # 2

"POSTGIS =" 1.5.2 "(sizden daha eski sürüm) kullanıyorum ve aşağıdaki ifade gayet iyi çalışıyor:

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

İhtiyacınız olanı elde etmek için bir işlev kombinasyonu kullanmanız gerekir.

distance_spheroid, geometri veri türlerini aldığı için CIRCULARSTRING özelliğini desteklemez.

Lütfen sorunla ilgili bir örnek GML parçasıyla orijinal sorunuza bir EDIT ekleyin ve sizin için ifadeleri yazacağım.


Teşekkürler, ancak GML'den içe aktarma aslında asıl sorun değildir. Ana soru, verilerin doğru hesaplamalara izin verecek şekilde nasıl saklanacağıyla ilgilidir. Anladığım kadarıyla, geometri türü bunun için iyi çalışmaz, çünkü bir düzleme dayanır ve coğrafya türü eğrileri desteklemez.
EM0

@EM: EDIT # 1'imi kontrol et
CaptDragon

Teşekkürler, denedim, ama ne yazık ki CIRCULARSTRINGs desteklemiyor.
EM0

@EM: EDIT # 2'yi kontrol et
CaptDragon

Evet, bir CIRCULARSTRING oluşturma deyimi çalışır, ancak bu dizede mesafe hesaplamaları anladığım gibi bir düzlem kullanır, çünkü "geometri" türündedir. Her neyse, verileri iki şekilde depolamaya çalışacağım - CIRCULARSTRING (geometri) olarak kesin değer ve ST_CurveToLine kullanılarak oluşturulan yaklaşık değer (coğrafya).
EM0

2

Sonunda "tam" yay veya daireyi saklamaktan vazgeçtim. Bir GML Arkını içe aktarırken (ark üzerindeki 3 nokta ile tanımlanır) geçici olarak bir geometri oluştururum CIRCULARSTRING, ardından şu şekilde coğrafyaya dönüştürürüm:

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

Bir GML ArcByCenterPoint'i içe aktarırken (merkez noktası, yarıçap ve başlangıç ​​ve bitiş açıları ile tanımlanır), noktaları başlangıç ​​açısından bitiş açısına 1 derece aralıklarla yansıtarak doğrudan yaklaşırım. Bu, küre üzerinde değil, bir küre üzerinde yapılır, bu yüzden tamamen doğru değildir, ancak coğrafya türü için azimut ve nokta projeksiyonu uygulamak için PostGIS biletleri vardır . Aynı daire için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.