Tạo vòng tròn trong PostGIS?


22

Tôi đang sử dụng PostGIS 1.5.2, với hình học trong SRID: 900913. Tôi cần tạo một vòng tròn bằng cách sử dụng danh sách các điểm làm trung tâm, với bán kính 600 km. Tôi đang sử dụng truy vấn này:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

Nhưng các vòng tròn được tạo ra không có bán kính 600 km (bán kính gần độ dài này, nhưng không chính xác).

Có phương pháp nào khác để tạo vòng tròn trong PostGIS không?

LƯU Ý: Thông tin được đại diện là từ Tây Ban Nha. Phép chiếu đúng là 4326, nhưng máy khách sử dụng trình quét của Google, vì vậy tôi đang lưu trữ dữ liệu vào năm 900913 để tránh bị từ chối và tăng hiệu suất.


1
Làm thế nào bạn đo được bán kính để tìm ra chúng không phải là 600 km?
underdark

1
@underdark Tôi biết khoảng cách giữa hai thành phố và vòng tròn được tạo bằng cách sử dụng làm trung tâm của một thành phố này không mở rộng đến thành phố khác. Tôi xác minh khoảng cách giữa hai thành phố bằng gmap-pedometer.com
angelcervera

3
Đây âm thanh liên quan đến gis.stackexchange.com/questions/10148/...
Underdark

@underdark Sử dụng SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));trả lại hơn 100km sự khác biệt tôn trọng gmap-pedometer.com, nhưng nếu tôi cho rằng độ dài này là chính xác, bán kính vòng tròn là hoàn hảo. Nhưng mọi người sử dụng khoảng cách đầu tiên là bán kính, không có khoảng cách nào được trả về bởi st_distance. Có thể chuyển đổi khoảng cách đầu tiên sang thứ hai?
angelcervera

Câu trả lời:


15

Thử đi:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

Điều này chuyển sang địa lý sau đó sử dụng lựa chọn SRID sẵn có để (trớ trêu thay) lật ngược lại thành hình học trong đó một bộ đệm phẳng tốt được chạy sau đó lật lại. Vấn đề với cách tiếp cận của bạn trong Mercator là Mercator không giữ được khoảng cách. Sử dụng phép chiếu cục bộ phù hợp hơn sẽ cho kết quả tốt hơn và đó là những gì xảy ra trong phương pháp trên.


4

Bạn có thể tăng giá trị quad_seg để có được vòng tròn chính xác hơn. Để có được một vòng tròn thực sự, bạn phải làm việc với một loại hình học cong, nhưng tôi không biết phần mềm nào có thể hiển thị điều đó.

Độ chính xác của srid 90013 cũng rất tệ vì nó là một hình chiếu trên toàn thế giới.

Bạn sẽ nhận được một kết quả chính xác hơn với một phép chiếu cục bộ.


@ nicklas-aven Có thể chênh lệch 100km trong khoảng cách 600km vì tôi đang sử dụng phép chiếu 900913 chứ không phải 4326?
angelcervera

1
vâng nó có thể kiểm tra Pauls nhận xét cô ấy khi tôi không thể tin rằng không chính xác gis.stackexchange.com/questions/3264/ . điều này là 4326 không được chiếu.
Nicklas Avén

3

Nó phụ thuộc vào nơi vòng tròn của bạn đang được tạo. Chúng ở gần xích đạo hay gần cực hơn?

Hãy nhìn vào bản đồ này . Bạn có nghĩ Antartica hay Greenland thực sự lớn đến thế không? Đó là hình chiếu bạn đang sử dụng, phải không?

Tôi khuyên bạn nên đọc nhanh tài liệu USGS này về các phép chiếu , đặc biệt là bảng dưới đây cung cấp cho bạn ý tưởng nhanh về các phép chiếu nào tốt cho việc gì.

Và sau tất cả những điều đó, tôi nghĩ cuối cùng tôi cũng nên trả lời câu hỏi của bạn :)

Những gì Nicklas nói là lời khuyên tốt. Có một dự báo cụ thể cho khu vực địa phương của bạn sẽ làm việc tốt hơn?

Nếu không, bạn có thể muốn xem loại Địa lý PostGIS mới . Tuy nhiên, câu trả lời thích hợp nhất phụ thuộc vào vị trí của dữ liệu của bạn.

CẬP NHẬT: Từ bây giờ chúng tôi biết rằng dữ liệu của bạn ở Tây Ban Nha, bạn có xem việc lưu trữ dữ liệu đó trong một phép chiếu cục bộ như UTM Khu vực 31N , thực hiện các thao tác của bạn bằng cách sử dụng dữ liệu đó và sau đó chiếu chúng trở lại Google Web Mercator không?


1
+1 để sử dụng loại địa lý cho bản đồ bao gồm các khu vực tuyệt vời. vấn đề ở đây là không có chức năng đệm riêng cho loại địa lý trong postgis. nhưng có một diễn viên sẵn có để "srid tốt nhất", xây dựng bộ đệm và sau đó quay lại 4326. Vì vậy, việc biết dữ liệu của bạn và chọn một srid bằng tay sẽ giúp kiểm soát tốt hơn.
Nicklas Avén

Nicklas, bạn đã đúng về việc phân vai và tôi đồng ý với bạn 100% về phép chiếu cục bộ (tức là biết dữ liệu của bạn). Tuy nhiên, nếu câu trả lời là anh ta chỉ muốn có dữ liệu "toàn thế giới", IMHO, logic đúc trong loại Địa lý sẽ thực hiện công việc tốt hơn nhiều trong việc tìm ra SR nào phù hợp cho hoạt động khoảng cách cụ thể đó hơn là bất kỳ logic tùy chỉnh phức tạp. Một điều tốt nữa về loại địa lý là mặc dù rất nhiều các hoạt động hiện đang được chuyển sang toán học cartesian, các hoạt động tiếp tục được cập nhật để sử dụng toán học hình cầu.
Ragi Yaser Burhum

2

Bạn có thể sử dụng kiểu hình học SQL / MM Phần 3 mới CIRCULARSTRING và / hoặc CURVEPOLYGON.

Tuy nhiên, được cảnh báo rằng sự hỗ trợ cho loại này bị hạn chế, cả chức năng bên trong và chương trình bên ngoài. Bạn có thể sử dụng ST_CurveToLine để giúp trực quan hóa nó.

Hơn nữa, đó là một chút lạc quan (như PostGIS 2.0 svn) SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)chỉ là một xấp xỉ thô của π . (So ​​sánh 3.14033115695485 với 3.14159265358979 từ pi()).


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.