Lưu trữ bề mặt GML trong PostGIS


9

Tôi đang sử dụng PostGIS 2.0.0 và muốn lưu trữ Bề mặt GML theo cách cho phép tính toán các giao điểm giữa bề mặt đó và các điểm và đường khác nhau. Trong trường hợp của tôi, Surface sẽ có một PolygonPatch không có vòng trong và vòng ngoài có thể là LineStringSegment, Geodesic, Arc hoặc Circle. Khoảng cách có thể theo thứ tự của hàng chục đến hàng trăm dặm. Tôi thấy rằng PostGIS có CIRCULARSTRINGCURVEPOLYGONdường như là một cách tốt để lưu trữ Arc, ngoại trừ việc chúng không được hỗ trợ bởi geographyloại này geometry. Điều gì sẽ là cách tốt nhất để lưu trữ này? (Nói chung tôi khá mới đối với PostGIS và GIS, vì vậy hoàn toàn có thể tôi đang thiếu một cái gì đó rõ ràng.)


Bạn có thể lưu trữ GML trong postgis. postgis.refraction.net/documentation/manual-svn/ từ
Mapperz

Một số giải thích ở đây về hình học và địa lý loại PostGIS của postgis.refractions.net/docs/...
canisrufus

Câu trả lời:


4

ST_GeomFromGML

Bạn có thể lưu trữ các tính năng GML của mình dưới dạng kiểu dữ liệu Hình học PostGIS bằng cách sử dụng hàm ST_GeomFromGML sẽ chuyển đổi GML của bạn thành kiểu dữ liệu hình học. FYI: Có các chức năng tương tự cho KML, WKT, v.v.

chỉ cần làm một cái gì đó như:

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

Khi bạn có nó trong trường hình học, bạn có thể thực hiện tất cả các giao điểm thú vị và những thứ bạn muốn làm trong PostGIS

Sau đó, bạn có thể nhổ kết quả của mình ra ở định dạng GML bằng ST_AsGML

EDIT # 1 Tôi tin rằng bạn đang tìm kiếm:

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

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

EDIT # 2

Tôi đang sử dụng "POSTGIS =" 1.5.2 "(phiên bản cũ hơn bạn) và câu lệnh sau hoạt động tốt:

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

Bạn phải sử dụng kết hợp các chức năng để có được những gì bạn cần.

distance_spheroid không hỗ trợ CIRCULARSTRING vì nó có các kiểu dữ liệu hình học.

Vui lòng thêm EDIT vào câu hỏi ban đầu của bạn với một mẩu GML mẫu mà bạn đang gặp vấn đề và tôi sẽ viết ra các tuyên bố cho bạn.


Cảm ơn, nhưng nhập từ GML không thực sự là vấn đề cốt lõi. Câu hỏi chính là xoay quanh cách lưu trữ dữ liệu theo cách cho phép tính toán chính xác. Theo tôi hiểu, loại hình học sẽ không hoạt động tốt cho điều đó, vì nó dựa trên một mặt phẳng và loại địa lý không hỗ trợ các đường cong.
EM0

@EM: Kiểm tra EDIT # 1 của tôi
CaptDragon

Cảm ơn, đã thử những thứ đó, nhưng tiếc là họ không hỗ trợ CIRCULARSTRING.
EM0

@EM: Kiểm tra EDIT # 2 của tôi
CaptDragon

Đúng, câu lệnh để tạo ra một CIRCULARSTRING hoạt động, nhưng tính toán khoảng cách trên chuỗi đó sử dụng một mặt phẳng, theo tôi hiểu, bởi vì nó thuộc loại "hình học". Dù sao, tôi sẽ thử lưu trữ dữ liệu theo hai cách - giá trị chính xác là CIRCULARSTRING (hình học) và giá trị gần đúng (địa lý) được tạo bằng ST_CurveToLine.
EM0

2

Cuối cùng, tôi đã từ bỏ việc lưu trữ vòng cung hoặc vòng tròn "chính xác". Khi nhập Arc GML (được xác định bởi 3 điểm trên cung), tôi tạm thời tạo một hình học CIRCULARSTRING, sau đó chuyển đổi nó thành địa lý, như sau:

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

Khi nhập GML ArcByCenterPoint (được xác định bởi điểm trung tâm, bán kính và góc bắt đầu và góc kết thúc) Tôi ước tính trực tiếp bằng cách chiếu các điểm ở các khoảng 1 độ từ góc bắt đầu đến góc kết thúc. Điều này được thực hiện trên một hình cầu, không phải hình cầu, vì vậy nó không hoàn toàn chính xác, nhưng có vé PostGIS để thực hiện góc phương vịchiếu điểm cho loại địa lý. Tương tự cho một vòng tròn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.