Tính tọa độ dặm x vuông từ điểm trung tâm?


11

Tôi cố gắng để tạo rìu vuông dặm (hoặc hình tròn) xung quanh một điểm trung tâm, nơi mà tất cả cạnh của hình vuông sẽ là x dặm từ trung tâm. Tôi cần tọa độ 4 góc.

Nó đang tranh giành bộ não của tôi đang cố gắng để có được đầu của tôi tròn nó? Tôi có thể tìm ra khoảng cách giữa hai điểm bằng công thức haversine nhưng toán học thực sự không phải là điểm mạnh của tôi và tôi không hiểu tội lỗi, v.v. và cố gắng loại bỏ điều này đã làm tôi mất đi!

Tôi đã đi qua Tính toán Vĩ độ / Kinh độ X từ điểm? Nhưng tôi không hiểu!

Có ai đủ tử tế để giải thích cách tôi làm điều này bằng thuật ngữ táo và lê không?

Để giải thích chính xác những gì tôi đang cố gắng làm;

Tôi có một trang web, nơi người dùng có thể tìm kiếm các tòa nhà trong một khu vực cụ thể. Họ sẽ bước vào một thị trấn hoặc nơi (mà tôi sẽ biết lat dài) và họ tìm kiếm trong vòng bán kính cụ thể của tiếng nói 10 dặm của nơi này.

Tôi cần tìm min / max lat và long của bán kính 10mile để tôi có thể truy vấn cơ sở dữ liệu của mình bằng mệnh đề where tương tự như:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

Tôi cần một số loại công thức!

Tọa độ của tôi là độ thập phân

Câu trả lời:


10

Đối với mục đích này, xấp xỉ đơn giản là nhiều hơn đủ tốt. Bắc hay phía nam, một mức độ khoảng 69 dặm nhưng đông hoặc tây, nó chỉ là 69 * cos (vĩ độ) dặm. Vì vĩ độ không thay đổi nhiều trong khoảng mười dặm, nên bạn có thể sử dụng cosin của vĩ độ trung tâm của "hình vuông" một cách an toàn. Do đó tọa độ mong muốn cho đỉnh vuông ở khoảng cách r dặm từ một vị trí trung tâm (f, l), được đưa ra như lat-lon, được tính như

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

Ví dụ, giả sử r = 10 dặm và vị trí trung tâm là ở vĩ độ 50 độ bắc, kinh độ 1 độ về phía tây, do đó (f, l) = (50, -1) độ. Sau đó

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

và các tọa độ là (49.855, -1.225), (50.145, -1.225), (50.145, -0.775) và (49.855, -0.775) khi bạn di chuyển theo chiều kim đồng hồ quanh góc vuông bắt đầu ở góc tây nam của nó.

Không sử dụng xấp xỉ này gần các cực hoặc cho các hình vuông lớn hơn một vài độ ở một bên. Ngoài ra, tùy thuộc vào các hạn chế của GIS, một số chăm sóc có thể cần thiết xung quanh việc cắt giảm kinh độ toàn cầu, thường được thực hiện ở + -180 độ.


4

Lấy X phối hợp của trung tâm và trừ x dặm từ nó đây là mặt trái của hình vuông của bạn. Sau đó, lấy Y phối hợp của trung tâm và trừ X dặm từ nó, đây là đáy của hình vuông của bạn. Lặp lại các bước này nhưng thêm vào thay vì trừ đi để có được cạnh phải và cạnh trên. Bây giờ bạn có thể xây dựng bốn góc của hình vuông của bạn.

Lưu ý trên giả định rằng điểm trung tâm của bạn là trong dặm. Nếu nó không phải là đầu tiên reproject nó. Khôn ngoan khác tất cả các cược đã tắt và hình vuông của bạn sẽ không vuông.


Bạn đang đề cập đến trang ví dụ? Làm thế nào để trừ dặm từ một phối hợp và để tôi không cần phải thực hiện độ cong của trái đất vào tài khoản?
Bex

Không, nó đơn giản đến mức không có nhu cầu thực sự để có một ví dụ hoạt động. Có lẽ bạn cần chỉ định phần mềm nào bạn đang sử dụng? Như tôi đã nói, giải pháp của tôi cho rằng bạn đã dự kiến ​​tọa độ của mình cho một SRS địa phương (nếu bạn không có thì đó là câu hỏi đầu tiên của bạn)
Ian Turton

Tôi thực sự bối rối bây giờ! Tôi đã cập nhật câu hỏi của mình để nói chính xác những gì tôi đang cố gắng làm. Tôi cần phải tạo một hộp giới hạn để tôi có thể tìm thấy min và max lat và long.
Bex

3
proj4js ( proj4js.org ) sẽ giúp sau đó
Ian Turton

1
Tọa độ của tôi trông như thế này: 51.498485, -0.129089 đó là độ phải không?
Bex

4

Cuối cùng, câu trả lời của tôi là: (trong c #)

Tôi có thể không cần 4 tọa độ nhưng tôi nghĩ chúng khá chính xác.

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

BIÊN TẬP

Vừa mới nhận ra nếu tôi đặt góc dặm x vuông của tôi từ điểm trung tâm, các cạnh của hình vuông của tôi sẽ không phải là x dặm cùng. (Nói toán học không phải là điểm mạnh của tôi) Vì vậy, để có được những điểm góc khoảng cách từ điểm trung tâm nếu tôi muốn hình vuông cạnh tôi để x dặm tôi dùng Pythagoras' Định lý để tìm ra khoảng cách của các đường chéo. (trên một tam giác góc vuông bên phải, hình vuông trên cạnh huyền (đường chéo) bằng với hình vuông của hai cạnh còn lại)


đó sẽ không phải là một hình vuông.
Ian Turton

Tôi đã sửa đổi vòng bi của mình, nó là một viên kim cương .. giờ nó vuông
Bex

Liên quan đến chỉnh sửa, Định lý Pythagore là ổn đối với các hình vuông nhỏ, nhưng nói chung nó không giữ cho các hình tam giác bên phải hình cầu. Do đó, thật lạ khi mã của bạn sử dụng lượng giác hình cầu cùng với phép tính gần đúng này dựa trên hình học phẳng.
whuber

Khoảng cách của tôi sẽ không bao giờ có hơn 100 dặm vì vậy tôi không nghĩ rằng nó quan trọng. Vì sự không chính xác sẽ nhỏ với khoảng cách nhỏ hơn đó.
Bex

1
Tôi nghĩ rằng điểm @whuber đang đưa ra là không có lợi ích gì khi sử dụng phép tính phức tạp về khoảng cách dọc theo Lat và Long, do đó sau đó bạn kết hợp chúng với định lý pythagore. Thay vào đó, bạn có thể sử dụng một phép tính đơn giản hơn nhiều, chẳng hạn như whuber đã làm, hoặc như Ewan Todd đã làm. Sử dụng đơn giản tuyến tính công thức để chuyển đổi kinh độ và vĩ độ để dặm để dặm, hoặc ngược lại. Các chỉ "khéo léo" một phần là biết rằng công thức kinh độ cần điều chỉnh * cos(lat)khi chuyển đổi độ để dặm, và / cos(lat)khi chuyển đổi dặm sang độ.
ToolmakerSteve

0

Nếu bạn đang sử dụng cơ sở dữ liệu nhận thức không gian, bạn có thể chuyển đổi khu vực quan tâm của mình sang cùng một hệ tọa độ, dữ liệu của bạn được lưu trữ và sau đó thực hiện so sánh táo với táo.

Ví dụ:

  1. Người dùng chọn một vị trí, dẫn đến lat / lon.
  2. Yêu cầu cơ sở dữ liệu không gian để chuyển đổi điểm này thành một hệ tọa độ dự kiến ​​phù hợp với khu vực (đơn vị feet hoặc mét, v.v.).
  3. Xây dựng khu vực quan tâm của bạn xung quanh điểm dự kiến.
  4. Yêu cầu cơ sở dữ liệu không gian để chuyển đổi khu vực quan tâm này trở lại lat / lon.
  5. Làm bất cứ điều gì so sánh bạn cần làm.

0

Tôi đã sử dụng những gì trong trang này

Điểm đến cho khoảng cách và mang từ điểm bắt đầu

Công thức:
lat2 = asin (sin (lat1) * cos (d / R) + cos (lat1) * sin (d / R) * cos (θ))
lon2 = lon1 + atan2 (sin (θ) * sin (d / R) * cos (lat1), cos (d / R) −sin (lat1) * sin (lat2))

là ổ trục (tính bằng radian, theo chiều kim đồng hồ từ phía bắc); d / R là khoảng cách góc (tính bằng radian), trong đó d là khoảng cách di chuyển và R là bán kính trái đất

Đối với θ Tôi đã sử dụng -45 độ (tính bằng radian) cho "điểm trên bên trái" và 135 độ cho "dưới cùng bên phải"

(Gần đây tôi đã hỏi cùng một câu hỏi trong trang web toán học )


Vấn đề với giải pháp này là trước tiên bạn phải tìm ra khoảng cách cho các đường chéo của hình vuông. Thay vào đó, dễ dàng hơn để di chuyển dọc theo trắc địa từ trung tâm đến trung điểm của các cạnh và sau đó, xoay 90 độ, để di chuyển dọc theo các cạnh của hình vuông.
whuber

@whuber, Nếu khoảng cách đủ nhỏ, bạn có thể sử dụng lượng giác đơn giản cho nó không? (d = phía đối diện / tội lỗi (bên cạnh). Tôi làm điều đó bởi vì tôi không cần khoảng cách đó là chính xác. Nếu không, bạn có thể áp dụng công thức này hai lần để thực hiện chính xác những gì bạn nói (đầu tiên với = 0 sau đó với = -90 cho phía trên trái ví dụ)
juan

Đó là chính xác, Juan. Nhưng người ta lại tự hỏi tại sao bạn sử dụng các công thức phức tạp hơn của hình học hình cầu khi bạn bắt đầu với một phép tính gần đúng cho rằng các công thức Euclide sẽ hoạt động ngay từ đầu. Không có gì sai khi sử dụng các công thức hình cầu, nhưng nó không cần thiết và không hiệu quả về mặt tính toán.
whuber

@whuber, đối với trường hợp thứ hai, nó không gần đúng (áp dụng công thức hai lần cho mỗi bên). Bạn đúng rằng sẽ không có ý nghĩa gì khi trộn chúng. Tôi thực sự có điều này được thực hiện, nhưng tôi sẽ thay đổi nó (oh, và lý do là vì tôi không phải là giỏi toán :))
juan
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.