중심점에서 제곱 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.