Các phép đo khoảng cách tốt hơn trong phép chiếu Web Mercator


10

Tôi đang làm việc với ngăn xếp ESRI, lưu trữ các lớp của mình trong cơ sở dữ liệu địa lý sql-spatial-enable-SDE- geodatabase (Kiểu hình học, Web Mercator-3857).

Tôi đang xây dựng một ứng dụng bản đồ web, do đó, theo mặc định, các ô cũng nằm trong trình duyệt web, 3857.

Thông qua các procs được lưu trữ, tôi sử dụng STDistance để truy vấn khoảng cách từ vị trí của người dùng (Tọa độ cũng trong trình duyệt web) đến các lớp khác nhau.

Vấn đề là, do sự biến dạng của trình duyệt web, các khoảng cách của tôi ngày càng tắt, càng xa khỏi đường xích đạo mà chúng được tạo ra.

Tôi đã nghĩ đến việc lưu trữ các lớp của mình theo kiểu địa lý không gian (chứ không phải hình học), nhưng:

  • Tôi tưởng tượng các truy vấn khoảng cách của tôi sẽ mất nhiều thời gian hơn (khoảng cách calcs trên bề mặt hình cầu)
  • tôi sẽ cần nhập lại rất nhiều dữ liệu
  • dịch vụ arcgis sẽ không nhanh như họ sẽ cần phải dự án nhanh chóng

Nếu tôi truy cập Google maps và thực hiện một khoảng cách calc, khoảng cách được trả về sẽ chính xác hơn nhiều, ngay cả ở các khu vực phía Bắc / Nam, vì vậy tôi cho rằng Google phải sửa lỗi cho sự biến dạng gây ra bởi phép chiếu của trình duyệt web.

Câu hỏi của tôi sau đó: Có một giá trị yếu tố đơn giản nào có thể được áp dụng cho các khoảng cách được thực hiện trong phép chiếu web mercator để có được khoảng cách "chính xác" không?

Câu trả lời:


12

Đối với các khoảng cách ngắn, bạn có thể nhân khoảng cách tính toán với cos(lat), vì tỷ lệ của phép chiếu Mercator tỷ lệ thuận với độ trễ của vĩ độ (secant là 1/cos). Đồng thời xem http://en.wikipedia.org/wiki/Mercator_projection#Mathatures_of_the_projection


Phụ lục nhờ @ jeremiah-england : trong khi điều chỉnh ở trên sẽ đúng khi nói về các phép chiếu Mercator thực sự, Web Mercator (EPSG: 3857) không phải là Mercator. EPSG gọi đó là "Pseudo-Mercator." Vấn đề là nó sử dụng WGS84, một mô hình elip và dự án nó sử dụng các tính toán của bộ tạo hình cầu (mà Google đã sử dụng vì chúng nhanh hơn). Nếu bạn thu nhỏ khoảng cách của mình bằng 1/cos(phi)Mercator web, bạn sẽ giảm khoảng 0,6% tại xích đạo. Xem phần trình bày của Noel Zinn trên Web Mercator để biết thêm chi tiết.

Theo cách trình bày được đề cập ở trên, phương pháp sau đây có thể được sử dụng để tính khoảng cách chính xác hơn từ tọa độ trình duyệt web. Cho trước dx- chênh lệch tọa độ ngang (hướng WE) và dy- chênh lệch tọa độ dọc (hướng SN):

e = 0.081819191
adjustedX = dx * cos(lat) / sqrt(1 - e^2 * sin(lat)^2)
adjustedY = dy * cos(lat) * (1 - e^2) / pow(1 - e^2 * sin(lat)^2, 3/2)
adjustedDistance = hypot(adjustedX, adjustedY)

Tỷ lệ giữa sự điều chỉnh này và cos(lat)lớn hơn theo hướng SN, từ 0.9933đường xích đạo đến 1.0034cực. Tỷ lệ hướng WE bắt đầu bằng 1ở xích đạo và phát triển 1.0034ở hai cực.

Lưu ý rằng hiệu chỉnh này vẫn hoạt động hợp lý chỉ trong khoảng cách ngắn, trong đó hình học phẳng của bề mặt Trái đất có thể được giả định.


1
Và đối với khoảng cách xa hơn, bạn có thể sử dụng vĩ độ trung bình của hai điểm cuối: cos((l1 + l2)/2)sẽ cung cấp cho bạn khoảng cách khóa hình thoi / không đổi, thay vì khoảng cách vòng tròn lớn.
MerseyViking

chỉ thay đổi hình cầu, nhưng không cho độ chính xác giống như hình chiếu cục bộ.
falcacibar

1
@falcibar - Tôi không thấy cách chọn vĩ độ trung bình thay đổi hình cầu
mkadunc

@MerseyViking: cảm ơn, quên đề cập rằng vĩ độ tốt nhất để sử dụng cho phép tính sẽ là giá trị trung bình của hai điểm so sánh.
mkadunc

1
+1 cho câu trả lời. @Mersey: Tại sao điều chỉnh vĩ độ trung bình hoạt động? Rốt cuộc, các biến dạng trong Mercator có thể trở nên lớn tùy ý và sự ra đi của các loxodromes từ trắc địa cũng có thể lớn. Dường như có một số lỗi rất lớn có thể được thực hiện mà việc điều chỉnh đơn giản sẽ không đáng tin cậy.
whuber

6

Tôi sẽ xem xét tùy chọn thứ hai của bạn về việc lưu trữ dữ liệu của bạn ở GEOGRAPHYđịnh dạng một lần nữa nếu bạn đang tìm kiếm kết quả chính xác trên dữ liệu toàn cầu.

Không có gì ngăn bạn có hai trường không gian trong một bảng - một trong Mercator là một GEOMETRYloại và một trong WGS84 là một GEOGRAPHYloại (ít nhất là không phải trong SQL Server, tôi không chắc về ArcSDE).

Bạn sẽ có thể tạo một tập lệnh xử lý địa lý đơn giản sẽ điền cả hai trường với dữ liệu gốc của bạn. Nếu có chỉnh sửa và cập nhật thường xuyên diễn ra thì đây có thể không phải là một lựa chọn.

Khi bạn có hai trường, bạn có thể tiếp tục sử dụng Mercator để hiển thị nhanh và chuyển đổi điểm người dùng đã nhập thành Lat / Lon cho khoảng cách.

Điều này có hai ưu điểm chính:

  • bạn cũng có thể nhận được các khu vực và độ dài chính xác hơn của các tính năng dựa trên truy vấn của người dùng
  • bạn không cần lo lắng về việc quên thêm mã tùy chỉnh cho mỗi truy vấn liên quan đến các phép đo

Tốc độ truy vấn sẽ phức tạp hơn, nhưng nó có thể không được người dùng chú ý. Bạn có thể muốn thử nghiệm với một lớp tính năng trước khi quyết định giải pháp. Bạn cũng sẽ phải chuyển đổi điểm người dùng đã nhập từ Mercator (điều này không quan trọng và có thể được thực hiện trong trình duyệt).

Ngay cả với loại địa lý mặc dù vẫn có một lề lỗi:

Dung sai lỗi cho các phương pháp địa lý có thể lớn đến mức 1.0e-7 *

Từ MSDN


Thật không may, SDE sẽ chỉ cho phép một cột không gian: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#// . là một cách tiếp cận có thể.
Allan Adair

@ Allan - tốt để biết. Một tích cực khác cho việc sử dụng SDE rồi! Một bảng chỉ có hình học 4326 và liên kết trở lại bảng gốc + chế độ xem không gian sẽ đạt được cùng một mục đích
geographika

3

Một đề xuất khác từ ESRI là sử dụng "dịch vụ Hình học", liên quan đến việc gửi hình học đến Máy chủ ArcGIS và trả về kết quả. Nếu bạn không mong đợi bất kỳ vấn đề tắc nghẽn nào bằng cách sử dụng dịch vụ web, đây có thể là một cách tiếp cận rất hiệu quả. Tôi đã sử dụng cách tiếp cận tương tự trong một ứng dụng Silverlight.

Đây là một mục blog gốc từ ESRI: http://blogs.esri.com/Dev/bloss/arcgisserver/archive/2010/03/05/Measuring-distances-and-areas-when-your-map-uses-the -Mercator-chiếu.aspx

Trong blog có một ví dụ JavaScript được đơn giản hóa và cũng có một ứng dụng ví dụ đầy đủ ở đây: http://serverapps.esri.com/javascript_examples/compare_measurements.htmlm


0

Như google earth, bạn có thể chuyển đổi hình học sang phép chiếu vùng WGS84 cục bộ hoặc phép chiếu WGS84 nâng cao như SIRGAS ở Nam Mỹ.

Bạn có thể xem trong http://www.spatialreference.org để biết tọa độ của hầu hết tất cả các phép chiếu "được khoanh vùng" và bạn có thể tạo một bảng, v.v., để biến đổi chúng phụ thuộc vào vùng.

Chúng tôi tưởng tượng một khu vực bảng

|   minx     |    miny    |    maxx    |   maxy     |  srid  |
+------------+------------+------------+------------+--------+
|234567.34314|234567.34334|234567.34334|234567.34334|  1234  |

tất cả các giá trị minx, miny, maxx, maxy được lưu trữ trong Spherical Mercator (Web Mercator). vì vậy tôi sẽ sử dụng postgis làm ví dụ.

SELECT ST_Distance(
         ST_Transform( -- transform/reproject
            ST_SetSRID(geom_line, 3857) -- geom_line with forced srid assignation to web mercator
            , ( -- here we get the first SRID from the spatial position of geom_line
                 SELECT  srid
                 FROM    zones
                 WHERE   ST_Contains(
                           ST_MakeBox2d(ST_Point(minx,miny),ST_Point(maxx,maxy))
                           , geom_line
                         )
                 LIMIT 1
            ))

Hy vọng điều này sẽ hữu ích, có một ngày tốt đẹp.


Tôi không thể chắc chắn, nhưng dựa trên việc sử dụng "STDistance" của Blomster trong câu hỏi của anh ấy, có vẻ như anh ấy không sử dụng PostGIS. Nếu Blomster đang sử dụng SQL Server thì không có chức năng ST_Transform.
Allan Adair

Tôi đưa ra quy trình và cách tốt nhất để tôi có thể giải quyết nó, anh ta có thể giải quyết phần còn lại, dù sao anh ta cũng có thể sử dụng phần mềm từ chối, nhưng thực sự đáng tiếc khi SQL Server không xử lý các dự đoán.
falcacibar

có thể bật CLR và thư viện .net nettopologysuite có thể giúp gì không?
falcacibar

0

OpenLayers có một phương pháp tiện ích để tính khoảng cách giữa hai điểm EPSG: 4326 (WGS84) trên một ellipsoid. Vì OpenLayers là mã nguồn mở, bạn có thể thấy cách nó được triển khai ở đây: https://github.com/openlayers/openlayers/blob/release-2.12/lib/OpenLayers/Util.js#L750

Đối với những người sử dụng OpenLayers và điều khiển Đo, chỉ cần kích hoạt trắc địa trong các tùy chọn để sử dụng phép tính này.

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.