Sử dụng phép đo trắc địa cho Circle Radii?


15

Tôi hiện đang phát triển một trang web ánh xạ OpenLayers. Các phép đo có thể được thực hiện bằng cách sử dụng công cụ đường và công cụ khu vực. Cả hai điều này hiện được thiết lập để tính toán các phép đo trắc địa như được nêu trong API OpenLayers .

Tôi sử dụng các phép đo trắc địa thay vì đo phẳng như trong quá trình kiểm tra người dùng đã đặt câu hỏi cho các phép đo của công cụ về khoảng cách họ đã biết (chẳng hạn như lái xe giữa các thị trấn).

Một tính năng mới của trang web là cho người dùng có thể vẽ một vòng tròn trên bản đồ bán kính đã đặt. OpenLayers chỉ cho phép vẽ các vòng tròn bằng khoảng cách phẳng, vì vậy khi người dùng đo vòng tròn bằng công cụ đo trắc địa, các giá trị không khớp. Trong ảnh bên dưới bán kính phẳng hình tròn là 10km, nhưng số đo đường trắc địa cho đường kính là 12km.

Rõ ràng điều này sẽ khiến người dùng (và bản thân tôi) tự hỏi cái nào là chính xác.

văn bản thay thế

Nhìn vào câu trả lời này, có vẻ như hầu hết các hệ thống GIS trên máy tính để bàn "bỏ qua" vấn đề này và trả về các phép đo và khoảng cách phẳng. Vì vậy, thực tiễn tốt nhất về giao diện người dùng và độ chính xác để đối phó với các phép đo phẳng và trắc địa là gì?

Cập nhật

Tôi đã tìm thấy ví dụ Google này minh họa vấn đề bán kính và phép chiếu Mercator:

http://maps.forum.nu/gm_sensitive_circle2.html

Mã JavaScript để vẽ vòng tròn như sau:

    var lat1 = (PI/180)* center.lat(); // radians
    var lng1 = (PI/180)* center.lng(); // radians

    for (var a = 0 ; a < 361 ; a++ ) {
        var tc = (PI/180)*a;
        var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
        var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
        var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
        var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
        circlePoints.push(point);
        bounds.extend(point);
    }

Liệu vòng tròn này có tính đến độ cong của trái đất?

Cập nhật cuối cùng

Mã làm việc được đăng tại http://geographika.co.uk/creating-a-geodesic-circle-in-openlayers


1
một cái gì đó phải sai ở đây. sự khác biệt không thể là 20% trong khoảng cách ngắn như vậy giữa đường thẳng và đường thẳng sau hình cầu. đôi khi phải tham gia
Nicklas Avén

4
Phép chiếu rất có khả năng là Mercator, chỉ có thang đo thực ở xích đạo (nói chung, thực tế có thể có các phép chiếu Mercator với tỷ lệ thực ở nơi khác (ở một vĩ độ), nhưng hầu hết các tham số toàn cầu đều sử dụng đường xích đạo). Và sai số tỷ lệ cho Mercator thực sự rất cao (vô hạn, trên thực tế, ở các cực) tăng dần khi bạn đi về phía bắc / nam từ vĩ độ thực.
Paul Ramsey

Các phép đo được thực hiện ở 52 độ Bắc và thực sự nằm trong phép chiếu Mercator. Vì vậy, điều này có nghĩa là bất kỳ tính năng phía máy khách nào được vẽ trong Mercator sẽ trả về các khu vực và độ dài rất không chính xác trừ khi gần đường xích đạo?
geographika

1
Vâng, đó là khá nhiều trường hợp, chiếu dữ liệu vào lưới địa phương tính bằng mét hoặc feet và tất cả sẽ tốt.
Ian Turton

2
@Paul Gọi tốt. Nhưng những dữ liệu này chỉ cho thấy hình chiếu là hình trụ, trong đó Mercator là một. Trong các hình chiếu trụ thực sự, biến dạng ngang bằng giây (vĩ độ). Theo công thức này, độ méo 20 / 12,13 hoạt động ở vĩ độ 52,66 độ; đó chính xác là vĩ độ của Limerick.
whuber

Câu trả lời:


8

Nếu bạn đang tự pha chế trong trình duyệt, bạn có thể có một "vòng tròn" (nó sẽ không tròn trên màn hình do hình chiếu của bạn; thay vào đó là xấp xỉ bởi một đa giác có nhiều điểm bạn muốn vẽ), hãy sử dụng một hình thức trực tiếp của tính toán trắc địa: đưa ra một điểm, một hướng (góc phương vị) và khoảng cách nó cung cấp cho bạn điểm kết quả. Thông tin chi tiết: http://en.wikipedia.org/wiki/Vincenty%27s_formulae#Direct_Method

Có vẻ như ai đó đã thực hiện một bản dịch sang javascript: http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html . Bạn thật may mắn!

Để kết thúc mọi thứ:

  • Quyết định mức độ chunky (# đỉnh, gọi nó là n) bạn sẵn sàng có kết quả cuối cùng.
  • Chia 360 độ thành n mảnh.
  • Xây dựng một đa giác bằng (cho i trong phạm vi (n): polygon.add (vincenty_direct (start_point, i * 360 / n, distance)))
  • Sau khi thực tế, có thể khắc phục một số kích thích chiếu và lên kế hoạch:
    • Nếu bạn đang sử dụng phép chiếu bản đồ web điển hình, mà bạn gần như chắc chắn là, đa giác kết quả sẽ được kéo dài theo chiều dọc nếu nó gần một cực.
    • Tương tự, nếu đa giác kết quả vượt qua dòng ngày quốc tế, nó sẽ thực sự bị bẻ cong.

Chúc mừng!


1
Phương thức Vincenty đã được thêm vào OpenLayers trong không gian tên utils - dev.openlayers.org/apidocs/files/OpenLayers/ trộm với điều này và giải thích của bạn, đặc biệt là tham số mang, làm rõ điều này. Cảm ơn!
geographika

:) Hãy cho tôi biết mức độ khó chịu của 'sự kích thích'. Lý tưởng nhất là việc sửa lỗi sẽ là một phần của OpenLayers và nó sẽ chỉ hoạt động, nhưng tôi không chắc chắn.
Dan S.

3

OpenLayers chỉ cho phép vẽ các vòng tròn bằng khoảng cách phẳng

Để có được vòng tròn trắc địa, bạn có thể sử dụng thao tác đệm trong dịch vụ hình học của ESRI.

... nếu đơn vị là tuyến tính như feet hoặc mét, bộ đệm trắc địa được thực hiện

Một truy cập tự do có sẵn ở đây .


Cảm ơn liên kết hữu ích - Tôi sẽ xem liệu tôi có thể gọi dịch vụ và cập nhật tính năng này trong JavaScript không. Mối quan tâm duy nhất của tôi sẽ là dựa vào một dịch vụ web có thể bị tắt bất cứ lúc nào. Tôi đoán rằng điểm đệm trắc địa sẽ là vòng tròn 10km chính xác / thực?
geographika

Vòng tròn phải chính xác, tuy nhiên, tôi sẽ kiểm tra nó bằng công cụ đo lường của bạn. Tôi nghĩ rằng dịch vụ hình học là một phần của cài đặt máy chủ arcgis tiêu chuẩn, vì vậy nếu dịch vụ đó bị loại bỏ thì nên có nhiều thứ khác trên web để lựa chọn. google.com/
bào
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.