Câu trả lời này được chia thành nhiều phần:
Phân tích và giảm thiểu vấn đề , chỉ ra cách tìm điểm mong muốn với thói quen "đóng hộp".
Minh họa: một Nguyên mẫu làm việc , đưa ra mã làm việc.
Ví dụ , hiển thị ví dụ về các giải pháp.
Cạm bẫy , thảo luận về các vấn đề tiềm năng và làm thế nào để đối phó với chúng.
Triển khai ArcGIS , nhận xét về việc tạo một công cụ ArcGIS tùy chỉnh và nơi để có được các thói quen cần thiết.
Phân tích và giảm thiểu vấn đề
Hãy bắt đầu bằng cách quan sát rằng trong mô hình hình cầu (hoàn hảo tròn) sẽ luôn có một giải pháp - thực tế, chính xác là hai giải pháp. Cho các điểm cơ sở A, B và C, mỗi cặp xác định "bisector vuông góc" của nó, là tập hợp các điểm tương đương từ hai điểm đã cho. Bisector này là một trắc địa (vòng tròn lớn). Hình học hình cầu là hình elip : bất kỳ hai trắc địa giao nhau (trong hai điểm duy nhất). Do đó, các điểm giao nhau giữa bisector của AB và bisector của BC là - theo định nghĩa - tương đương từ A, B và C, từ đó giải quyết vấn đề. (Xem hình đầu tiên bên dưới.)
Mọi thứ trông phức tạp hơn trên một ellipsoid, nhưng vì nó là một nhiễu loạn nhỏ của hình cầu, chúng ta có thể mong đợi hành vi tương tự. (Việc phân tích điều này sẽ đưa chúng ta đi quá xa.) Các công thức phức tạp được sử dụng (bên trong một hệ thống GIS) để tính khoảng cách chính xác trên ellipsoid không phải là một biến chứng về mặt khái niệm: mặc dù vấn đề về cơ bản là giống nhau. Để xem vấn đề thực sự đơn giản như thế nào, hãy nêu nó một cách trừu tượng. Trong tuyên bố này, "d (U, V)" đề cập đến khoảng cách chính xác, hoàn toàn chính xác giữa các điểm U và V.
Cho ba điểm A, B, C (dưới dạng cặp lat-lon) trên một ellipsoid, tìm một điểm X mà (1) d (X, A) = d (X, B) = d (X, C) và ( 2) khoảng cách chung này càng nhỏ càng tốt.
Ba khoảng cách này đều phụ thuộc vào X chưa biết . Do đó, sự khác biệt về khoảng cách u (X) = d (X, A) - d (X, B) và v (X) = d (X, B) - d (X, C) là các hàm có giá trị thực của X. Một lần nữa, hơi trừu tượng, chúng ta có thể tập hợp những khác biệt này thành một cặp theo thứ tự. Chúng tôi cũng sẽ sử dụng (lat, lon) làm tọa độ cho X, cho phép chúng tôi coi đó là một cặp theo thứ tự, giả sử X = (phi, lambda). Trong thiết lập này, chức năng
F (phi, lambda) = (u (X), v (X))
là một hàm từ một phần của không gian hai chiều lấy các giá trị trong không gian hai chiều và vấn đề của chúng tôi giảm xuống còn
Tìm tất cả có thể (phi, lambda) mà F (phi, lambda) = (0,0).
Đây là nơi mà sự trừu tượng được đền đáp: có rất nhiều phần mềm tuyệt vời để giải quyết vấn đề này (hoàn toàn là tìm kiếm gốc đa chiều số). Cách thức hoạt động là bạn viết một thói quen để tính F , sau đó bạn chuyển nó cùng với phần mềm cùng với bất kỳ thông tin nào về các hạn chế đối với đầu vào của nó ( phi phải nằm trong khoảng -90 đến 90 độ và lambda phải nằm trong khoảng -180 đến 180 độ). Nó biến mất trong một phần của giây và trả về (thường) chỉ một giá trị của ( phi , lambda ), nếu nó có thể tìm thấy một giá trị.
Có nhiều chi tiết để xử lý, bởi vì có một nghệ thuật cho vấn đề này: có nhiều phương pháp giải pháp khác nhau để lựa chọn, tùy thuộc vào cách F "cư xử"; nó giúp "điều khiển" phần mềm bằng cách cho nó một điểm khởi đầu hợp lý cho tìm kiếm của nó (đây là một cách chúng ta có thể có được giải pháp gần nhất , thay vì bất kỳ giải pháp nào khác); và bạn thường cần xác định mức độ chính xác mà bạn muốn giải pháp đạt được (để biết khi nào nên dừng tìm kiếm). (Để biết thêm về những gì các nhà phân tích của GIS cần biết về các chi tiết như vậy, điều này xuất hiện rất nhiều trong các vấn đề về GIS, vui lòng truy cập các chủ đề được đề xuất trong khóa học về Khoa học máy tính cho Công nghệ không gian địa lý và xem phần "Miscellany" gần cuối. )
Minh họa: một nguyên mẫu làm việc
Phân tích cho thấy chúng ta cần lập trình hai điều: ước tính ban đầu về giải pháp và tính toán F chính
Ước tính ban đầu có thể được thực hiện bằng "trung bình hình cầu" của ba điểm cơ bản. Điều này có được bằng cách biểu diễn chúng theo tọa độ Cartesian (x, y, z), lấy trung bình các tọa độ đó và chiếu trung bình đó trở lại hình cầu và biểu thị lại theo vĩ độ và kinh độ. Kích thước của hình cầu là phi vật chất và do đó các tính toán được thực hiện đơn giản: bởi vì đây chỉ là điểm khởi đầu, chúng tôi không cần tính toán ellipsoidal.
Đối với nguyên mẫu làm việc này, tôi đã sử dụng Mathicala 8.
sphericalMean[points_] := Module[{sToC, cToS, cMean},
sToC[{f_, l_}] := {Cos[f] Cos[l], Cos[f] Sin[l], Sin[f]};
cToS[{x_, y_, z_}] := {ArcTan[x, y], ArcTan[Norm[{x, y}], z]};
cMean = Mean[sToC /@ (points Degree)];
If[Norm[Most@cMean] < 10^(-8), Mean[points], cToS[cMean]] / Degree
]
(Điều If
kiện cuối cùng kiểm tra xem trung bình có thể thất bại rõ ràng khi chỉ ra kinh độ hay không; nếu vậy, nó sẽ trở về trung bình số học thẳng của vĩ độ và kinh độ của đầu vào - có thể không phải là một lựa chọn tuyệt vời, nhưng ít nhất là một giá trị hợp lệ. Đối với những người sử dụng mã này để hướng dẫn triển khai, lưu ý rằng các đối số của Mathicala ArcTan
bị đảo ngược so với hầu hết các triển khai khác: đối số đầu tiên của nó là tọa độ x, tọa độ thứ hai là tọa độ y và nó trả về góc do vectơ tạo ra ( x, y).)
Theo như phần thứ hai đi, vì Mathematica --like ArcGIS và gần như tất cả GISes khác - có chứa mã để tính toán khoảng cách chính xác trên ellipsoid, có gần như không có gì để viết. Chúng tôi chỉ gọi thói quen tìm kiếm gốc:
tri[a_, b_, c_] := Block[{d = sphericalMean[{a, b, c}], sol, f, q},
sol = FindRoot[{GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, a] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, b] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, c]},
{{f, d[[1]]}, {q, d[[2]]}},
MaxIterations -> 1000, AccuracyGoal -> Infinity, PrecisionGoal -> 8];
{Mod[f, 180, -90], Mod[q, 360, -180]} /. sol
];
Khía cạnh đáng chú ý nhất của việc triển khai này là cách nó tránh được sự cần thiết phải hạn chế vĩ độ ( f
) và kinh độ ( q
) bằng cách luôn tính toán chúng theo modulo 180 và 360 độ, tương ứng. Điều này tránh phải hạn chế vấn đề (thường tạo ra các biến chứng). Các thông số điều khiểnMaxIterations
vv được điều chỉnh để làm cho mã này cung cấp độ chính xác cao nhất có thể.
Để thấy nó hoạt động, hãy áp dụng nó cho ba điểm cơ bản được đưa ra trong một câu hỏi liên quan :
sol = tri @@ (bases = {{-6.28530175, 106.9004975375}, {-6.28955287, 106.89573839}, {-6.28388865789474, 106.908087643421}})
{-6,29692, 106,87}
Khoảng cách tính toán giữa giải pháp này và ba điểm là
{1450.23206979, 1450.23206979, 1450.23206978}
(đây là những mét). Họ đồng ý thông qua chữ số có nghĩa thứ mười một (thực tế là quá chính xác, vì khoảng cách hiếm khi chính xác đến tốt hơn một milimet hoặc hơn). Dưới đây là hình ảnh của ba điểm này (màu đen), ba điểm chia cắt lẫn nhau và giải pháp (màu đỏ):
Thí dụ
Để kiểm tra việc thực hiện này và hiểu rõ hơn về cách xử lý vấn đề, đây là một biểu đồ đường viền của sai lệch bình phương trung bình gốc trong khoảng cách cho ba điểm cơ bản cách nhau rộng rãi. (Sự khác biệt RMS có được bằng cách tính cả ba khác biệt d (X, A) -d (X, B), d (X, B) -d (X, C) và d (X, C) -d (X , A), tính trung bình các hình vuông của chúng và lấy căn bậc hai. Nó bằng 0 khi X giải quyết vấn đề và nếu không thì X di chuyển ra khỏi một giải pháp, và do đó đo lường mức độ "đóng" của chúng ta là một giải pháp tại bất kỳ vị trí nào. )
Các điểm cơ bản (60, -120), (10, -40) và (45,10) được hiển thị bằng màu đỏ trong phép chiếu Tấm Carree này; dung dịch (49,2644488, -49,9052992) - cần 0,03 giây để tính toán - có màu vàng. Sự khác biệt RMS của nó là ít hơn ba nanomet , mặc dù tất cả các khoảng cách có liên quan là hàng ngàn km. Vùng tối hiển thị giá trị nhỏ của RMS và vùng sáng hiển thị giá trị cao.
Bản đồ này cho thấy rõ một giải pháp khác nằm gần (-49.2018206, 130.0297177) (được tính với RMS gồm hai nanomet bằng cách đặt giá trị tìm kiếm ban đầu đối diện với giải pháp đầu tiên.)
Cạm bẫy
Bất ổn định số
Khi các điểm cơ sở gần như thẳng hàng và gần nhau, tất cả các giải pháp sẽ cách nhau gần nửa thế giới và cực kỳ khó xác định chính xác. Lý do là những thay đổi nhỏ ở một vị trí trên toàn cầu - di chuyển nó tới hoặc ra khỏi các điểm cơ bản - sẽ chỉ tạo ra những thay đổi cực kỳ nhỏ trong sự khác biệt của khoảng cách. Không có đủ độ chính xác và độ chính xác được xây dựng trong tính toán thông thường của khoảng cách trắc địa để xác định kết quả.
Ví dụ: bắt đầu với các điểm cơ bản tại (45.001, 0), (45, 0) và (44.999,0), được phân tách dọc theo Kinh tuyến gốc chỉ cách nhau 111 mét giữa mỗi cặp, tri
thu được giải pháp (11.8213, 77.745 ). Khoảng cách từ nó đến các điểm cơ sở là 8.127.964,998 77; 8.127.964,998 41; và 8.127.964,998 65 mét, tương ứng. Họ đồng ý đến milimet gần nhất! Tôi không chắc kết quả này có thể chính xác đến mức nào, nhưng sẽ không ngạc nhiên nhất nếu các triển khai khác trả lại các địa điểm cách xa địa điểm này, cho thấy sự bình đẳng tốt của ba khoảng cách.
Thời gian tính toán
Các tính toán này, vì chúng liên quan đến tìm kiếm đáng kể bằng cách sử dụng các tính toán khoảng cách phức tạp, không nhanh, thường đòi hỏi một phần đáng chú ý của một giây. Các ứng dụng thời gian thực cần phải nhận thức được điều này.
Triển khai ArcGIS
Python là môi trường kịch bản ưa thích cho ArcGIS (bắt đầu với phiên bản 9). Các gói scipy.optimize có rootfinder đa biến root
mà nên làm những gì FindRoot
thực hiện trong Mathematica mã. Tất nhiên ArcGIS tự cung cấp các tính toán khoảng cách ellipsoidal chính xác. Phần còn lại là tất cả các chi tiết triển khai: quyết định cách lấy tọa độ điểm cơ sở (từ một lớp được người dùng nhập vào từ tệp văn bản? Từ chuột?) Và cách trình bày đầu ra (dưới dạng tọa độ hiển thị trên màn hình? như là một điểm đồ họa? như một đối tượng điểm mới trong một lớp?), viết rằng giao diện, cảng Mathematica mã hiển thị ở đây (đơn giản), và bạn sẽ có tất cả các thiết lập.