중심점에서 제곱 x 마일의 좌표를 계산합니까?


11

정사각형의 모든면이 중심에서 x 마일 떨어진 중심점 주위에 도끼 마일 정사각형 (또는 원)을 만들려고합니다. 4 코너 좌표가 필요합니다.

내 머리를 둥글게 만들려고 두뇌를 움직이게하고 있는가? 나는 haversine 공식을 사용하여 두 점 사이의 거리를 계산할 수 있지만 수학은 심각하게 내 강점이 아니며 죄, 화장품 등을 이해하지 못합니다.이를 정리하려고하면 나를 잃어 버렸습니다!

나는 건너 한 지점에서 위도 / 경도 X 마일을 계산? 그러나 나는 그것을 얻지 못한다!

사과와 배 용어로 내가 어떻게하는지 설명 할만큼 친절합니까?

내가하려는 일을 정확하게 설명하기 위해;

사용자가 특정 지역의 건물을 검색 할 수있는 웹 사이트가 있습니다. 그들은 도시 나 장소에 들어가고 (내가 위도를 알게 될) 장소의 특정 반경 내에서 10 마일을 검색합니다.

10 마일 반경의 최소 / 최대 위도와 경도를 찾아서 where와 비슷한 where 절을 사용하여 데이터베이스를 쿼리 할 수 ​​있습니다.

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

나는 어떤 종류의 공식이 필요합니다!

내 좌표는 십진수입니다

답변:


10

이 목적을 위해 간단한 근사치가 충분합니다. 북쪽 또는 남쪽으로, 1 도는 약 69 마일이지만 동쪽 또는 서쪽은 69 * cos (위도) 마일입니다. 위도는 10 마일 범위에서 크게 변하지 않기 때문에 "사각형"의 중앙 위도 코사인을 안전하게 사용할 수 있습니다. 따라서 위도-경도로 주어진 중심 위치 (f, l) 에서 거리 r 마일의 정점 정점에 대한 원하는 좌표는 다음과 같이 계산됩니다.

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

예를 들어, r = 10 마일이고 중심 위치가 위도 50도, 경도 1도 서쪽에 있다고 가정하면 (f, l) = (50, -1)도됩니다. 그때

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)

남서쪽 모퉁이에서 시작하여 사각형 주위를 시계 방향으로 행진하면 좌표는 (49.855, -1.225), (50.145, -1.225), (50.145, -0.775) 및 (49.855, -0.775)입니다.

이 근사값을 극 근처 나 측면의 몇 도보 다 큰 정사각형에 사용하지 마십시오. 또한 GIS의 한계에 따라 경도가 전 세계적으로 + -180 도인 경우 전 세계적으로 약간의주의가 필요합니다.


4

중심의 X 좌표를 취하고 정사각형의 왼쪽 인 x 마일을 빼십시오. 그런 다음 중심의 Y 좌표를 가져와 X 마일을 빼십시오. 이는 사각형의 바닥입니다. 오른쪽과 위쪽 가장자리를 얻으려면 빼기 대신이 단계를 반복하십시오. 이제 사각형의 네 모서리를 구성 할 수 있습니다.

위의 내용은 중심점이 마일이라고 가정합니다. 먼저 재 투영하지 않으면. 다른 현명한 모든 베팅은 해제되고 귀하의 사각형은 사각형이 아닙니다.


예제 페이지를 참조하고 있습니까? 좌표에서 마일을 빼고 지구의 곡률을 고려할 필요가 없습니까?
Bex

아니, 너무 간단해서 실제 예제를 가질 필요가 없습니다. 사용중인 소프트웨어를 지정해야합니까? 내가 말했듯이 내 솔루션은 로컬 SRS에 좌표를 투영했다고 가정합니다 (그렇지 않은 경우 첫 번째 질문이어야 함)
Ian Turton

나는 지금 정말로 혼란 스럽다! 나는 내가하려는 일을 정확하게 말하도록 내 질문을 업데이트했습니다. 최소 및 최대 위도 및 경도를 찾을 수 있도록 경계 상자를 만들어야합니다.
Bex

3
proj4js ( proj4js.org )가 도움이 될 것입니다
Ian Turton

1
내 좌표는 다음과 같습니다 : 51.498485, -0.129089도 아닌가?
Bex

4

마지막으로 내 대답은 다음과 같습니다.

아마도 4 좌표가 필요하지는 않지만 상당히 정확하다고 생각합니다.

 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};
    }

편집하다

중심점에서 제곱 x 마일의 모서리를 설정하면 제곱의 가장자리가 같은 x 마일이되지 않습니다. (수학은 내 장점이 아니 었습니다.) 따라서 사각형 모서리를 x 마일로 원한다면 중심점에서 모퉁이 점 거리를 얻으려면 피타고라스의 정리를 사용하여 대각선의 거리를 계산하십시오. (직각 삼각형에서 빗변의 정사각형 (대각선)은 다른 두 변의 정사각형과 같습니다)


그것은 정사각형이 아닙니다.
Ian Turton

나는 베어링을 수정했습니다. 그것은 다이아몬드였습니다 .. 이제 정사각형입니다
Bex

편집과 관련하여 피타고라스 정리는 작은 사각형에는 적합하지만 일반적으로 구형 직각 삼각형에는 해당되지 않습니다. 따라서 코드에서 평면 형상을 기반으로하는이 근사와 함께 구면 삼각법을 사용하는 것이 이상합니다.
whuber

내 거리는 절대 100 마일을 넘지 않으므로 중요하지 않다고 생각합니다. 거리가 작을수록 부정확성이 작습니다.
Bex

1
@ whuber 가하고있는 요점은 위도 및 경도를 따라 복잡한 거리 계산을 사용하면 이점을 얻을 수 없다는 것입니다. 대신 whuber 또는 Ewan Todd 와 같이 훨씬 간단한 계산을 사용할 수 있습니다 . 간단한 선형 수식을 사용하여 경도를 마일로, 위도를 마일로 또는 그 반대로 변환합니다. 유일한 까다로운 부분은 경도를 * cos(lat)도를 마일로 / cos(lat)변환 할 때 와 마일을 도로 변환 할 때 경도 수식을 조정해야한다는 것입니다 .
ToolmakerSteve

0

공간 인식 데이터베이스를 사용하는 경우 관심 영역을 데이터가 저장된 동일한 좌표계로 변환 한 다음 사과 대 사과 비교를 수행 할 수 있습니다.

예를 들면 다음과 같습니다.

  1. 사용자가 위치를 선택하면 위도 / 경도가 나타납니다.
  2. 공간 데이터베이스에이 점을 해당 지역 (피트 또는 미터 등)에 적합한 투영 좌표계로 변환하도록 요청하십시오.
  3. 예상 지점 주위에 관심 영역을 구축하십시오.
  4. 이 관심 영역을 위도 / 경도로 다시 변환하도록 공간 데이터베이스에 요청하십시오.
  5. 필요한 비교를 수행하십시오.

0

이 페이지 의 내용을 사용했습니다

출발지로부터 거리와 방위가 주어진 목적지

공식 :
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))

θ는 방위 (라디안, 북쪽에서 시계 방향)입니다. d / R은 각거리 (라디안)이며, 여기서 d는 이동 한 거리이고 R은 지구의 반경입니다.

θ의 경우 "왼쪽 위 점"에 -45도 (라디안)를 사용하고 "오른쪽 아래"점에 135도를 사용했습니다

(최근에 수학 사이트 에서 같은 질문을했습니다 )


이 솔루션의 문제점은 먼저 사각형의 대각선 거리를 알아야한다는 것입니다. 대신 측지선을 따라 중앙에서 측면의 중간 점으로 이동 한 다음 90도 회전하여 정사각형 측면을 따라 이동하는 것이 더 쉽습니다.
whuber

@ whuber, 거리가 충분히 작 으면 간단한 삼각법을 사용할 수 없습니까? (d = 반대쪽 / sin (인접한 쪽). 나는 그 거리가 정확할 필요가 없기 때문에 그렇게한다. 예를 들어 왼쪽 상단의 경우 = -90)
juan

맞습니다, 후안 그러나 유클리드 수식이 처음부터 작동한다고 가정하는 근사치로 시작할 때 왜 더 복잡한 구형 지오메트리 수식을 사용하는지 궁금해합니다. 구형 공식을 사용하는 데 아무런 문제가 없지만 불필요하고 계산적으로 비효율적입니다.
whuber

@ whuber, 두 번째 경우는 근사하지 않습니다 (각 측면에 공식을 두 번 적용). 당신은 그것들을 혼합하는 것이 의미가 없다는 것이 맞습니다. 나는 실제로 이것을 구현했지만 그것을 바꿀 것이다 (오, 그 이유는 내가 수학을 잘하지 않기 때문이다 :))
juan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.