Obliczanie współrzędnych kwadratu x mil od punktu środkowego?

11

Usiłuję utworzyć milę kwadratową (lub okrąg) siekiery wokół centralnego punktu, w którym wszystkie boki kwadratu będą znajdować się x mil od centrum. Potrzebuję 4 współrzędnych narożnych.

Przeszywa mnie mózg, próbując ominąć głowę? Mogę obliczyć odległość między dwoma punktami za pomocą formuły haverine, ale matematyka to poważnie nie moja mocna strona i nie rozumiem grzechu, bo itp. .. a próby rozwiązania tego zgubiły mnie!

Czy natrafiłem na Obliczanie szerokości / długości geograficznej X mil od punktu? ale ja tego nie rozumiem!

Czy ktoś byłby na tyle uprzejmy, aby wyjaśnić, jak to robię w kategoriach jabłek i gruszek?

Aby dokładnie wyjaśnić, co próbuję zrobić;

Mam stronę internetową, na której użytkownicy mogą wyszukiwać budynki w określonym obszarze. Wchodzą do miasta lub miejsca (o których wiem, że długo) i szukają w określonym promieniu, powiedzmy 10 mil od tego miejsca.

Muszę znaleźć min / max lat i długości promienia 10 mil, aby móc wykonać zapytanie do mojej bazy danych przy użyciu klauzuli where podobnej do:

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

Potrzebuję jakiejś formuły!

Moje współrzędne są w stopniach dziesiętnych

Bex
źródło

Odpowiedzi:

10

W tym celu proste przybliżenia są więcej niż wystarczające. Na północ lub południe, jeden stopień to około 69 mil, ale na wschód lub zachód, to tylko 69 * cos (szerokości geograficznej) mil. Ponieważ szerokości geograficzne nie zmieniają się znacznie na przestrzeni dziesięciu mil, możesz bezpiecznie używać cosinusa środkowej szerokości geograficznej „kwadratu”. Dlatego pożądane współrzędne wierzchołków kwadratowych w odległości r mil od położenia centralnego (f, l), podane jako lat-lon, są obliczane jako

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

Załóżmy na przykład, że r = 10 mil, a centralna lokalizacja znajduje się na szerokości 50 stopni na północ, długości 1 stopień na zachód, więc (f, l) = (50, -1) stopni. Następnie

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)

a współrzędne to (49,855, -1,225), (50,145, -1,225), (50,155, -0,775) i (49,855, -0,775) podczas marszu wokół placu, zaczynając od jego południowo-zachodniego rogu.

Nie używaj tego przybliżenia w pobliżu biegunów lub kwadratów większych niż kilka stopni z boku. Ponadto, w zależności od ograniczeń GIS, może być potrzebna ostrożność wokół globalnego cięcia długości geograficznej, zwykle pod kątem + -180 stopni.

Whuber
źródło
4

Weź współrzędną X środka i odejmij x mil od niej, to jest lewa strona twojego kwadratu. Następnie weź współrzędną Y środka i odejmij X mil od niej, jest to dolna część twojego kwadratu. Powtórz te kroki, ale dodając zamiast odejmować, aby uzyskać prawą i górną krawędź. Możesz teraz zbudować cztery rogi swojego kwadratu.

Uwaga: powyższe zakłada, że ​​twój punkt środkowy jest w milach. Jeśli nie jest to pierwszy raz, ponownie go wypuść. W przeciwnym razie wszystkie zakłady są wyłączone, a Twój kwadrat nie będzie kwadratowy.

Ian Turton
źródło
Czy masz na myśli stronę przykładową? Jak odjąć mile od współrzędnej i czy nie muszę brać pod uwagę krzywizny ziemi?
Bex
Nie, to takie proste, że nie ma potrzeby posiadania sprawdzonego przykładu. Może musisz określić, jakiego oprogramowania używasz? Tak jak powiedziałem, moje rozwiązanie zakłada, że ​​rzutowałeś swoją współrzędną na lokalny SRS (jeśli nie, to powinno być twoje pierwsze pytanie)
Ian Turton
Jestem teraz naprawdę zdezorientowany! Zaktualizowałem moje pytanie, aby dokładnie powiedzieć, co próbuję zrobić. Potrzebuję stworzyć obwiednię, aby znaleźć min i max lat i long.
Bex,
3
proj4js ( proj4js.org ) powinien wtedy pomóc
Ian Turton
1
Moje współrzędne wyglądają następująco: 51,498485, -0,129089, czyli stopni, prawda?
Bex
4

Wreszcie moja odpowiedź brzmi: (in c #)

Prawdopodobnie nie potrzebuję 4 współrzędnych, ale myślę, że są dość dokładne.

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

EDYTOWAĆ

Właśnie się zorientowałem, że jeśli ustawię rogi mojego kwadratu x mile od punktu środkowego, krawędzie mojego kwadratu nie będą takie same x mil. (powiedział, że matematyka nie była moją mocną stroną) Aby więc uzyskać odległość punktów narożnych od punktu środkowego, jeśli chcę, aby krawędzie moich kwadratów były x mil, użyłem Twierdzenia Pitagorasa, aby obliczyć odległość przekątnej. (w trójkącie ustawionym pod kątem prostym kwadrat na przeciwprostokątnej (przekątnej) jest równy kwadratowi pozostałych dwóch boków)

Bex
źródło
to nie będzie kwadrat.
Ian Turton
Poprawiłem swoje łożyska, to był diament .. teraz jest kwadratowy
Bex
Jeśli chodzi o edycję, twierdzenie Pitagorasa jest odpowiednie dla małych kwadratów, ale ogólnie nie dotyczy sferycznych trójkątów prostokątnych. Dziwne jest zatem, że twój kod używa sferycznej trygonometrii wraz z tym przybliżeniem opartym na geometrii płaskiej.
whuber
Mój dystans nigdy nie przekroczy 100 mil, więc nie sądzę, żeby to miało znaczenie. Ponieważ niedokładności będą małe przy mniejszej odległości.
Bex
1
Myślę, że chodzi o to, że @whuber ma na myśli to, że nie ma korzyści ze złożonego obliczania odległości wzdłuż Lat i Long, biorąc pod uwagę, że następnie łączysz je z twierdzeniem pitagorejskim. Zamiast tego możesz użyć znacznie prostszych obliczeń, takich jak Whuber lub Ewan Todd . Użyj prostych wzorów liniowych, aby przekonwertować długość geograficzną na mile i szerokość geograficzną na mile lub odwrotnie. Jedyną „trudną” częścią jest wiedza, że ​​formuła długości geograficznej wymaga korekty * cos(lat)przy przeliczaniu stopni na mile i / cos(lat)przy przeliczaniu mil na stopnie.
ToolmakerSteve
0

Jeśli korzystasz ze świadomej przestrzennie bazy danych, możesz przekonwertować obszar zainteresowania na ten sam układ współrzędnych, w którym przechowywane są dane, a następnie dokonać porównania jabłek z jabłkami.

Na przykład:

  1. Użytkownik wybiera lokalizację, co powoduje lat / lon.
  2. Poproś o przestrzenną bazę danych, aby przekształciła ten punkt w rzutowany układ współrzędnych odpowiedni dla danego obszaru (jednostki stóp lub metrów itp.).
  3. Zbuduj swój obszar zainteresowania wokół rzutowanego punktu.
  4. Poproś o przestrzenną bazę danych, aby przekształciła ten obszar zainteresowania z powrotem na lat / lon.
  5. Wykonuj wszelkie porównania, które musisz wykonać.
Kruk
źródło
0

Użyłem tego, co jest na tej stronie

Punkt docelowy podany dystans i namiar od punktu początkowego

Wzór:
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) ssin (lat1) * sin (lat2))

θ jest namiarem (w radianach, zgodnie z ruchem wskazówek zegara od północy); d / R jest odległością kątową (w radianach), gdzie d jest odległością przebytą, a R jest promieniem ziemi

Dla θ użyłem -45 stopni (w radianach) dla „lewego górnego punktu” i 135 stopni dla „prawego dolnego punktu”

(Ostatnio zadałem to samo pytanie na stronie matematycznej )

juan
źródło
Problem z tym rozwiązaniem polega na tym, że najpierw musisz ustalić odległość przekątnych kwadratu. Zamiast tego łatwiej jest przemieszczać się wzdłuż geodezji od środka do punktów środkowych boków, a następnie, obracając o 90 stopni, poruszać się wzdłuż boków kwadratu.
whuber
@ whuber, jeśli odległość jest wystarczająco mała, czy nie możesz użyć do tego prostej trygonometrii? (d = strona przeciwna / grzech (strona sąsiednia). Robię to, ponieważ nie potrzebuję dokładnie tej odległości. W przeciwnym razie możesz zastosować tę formułę dwukrotnie, aby zrobić dokładnie to, co mówisz (najpierw z θ = 0, a następnie z θ = -90 dla górnej lewej na przykład)
Juan
Zgadza się, Juan. Pozostaje jednak pytanie, dlaczego używasz bardziej skomplikowanych formuł sferycznej geometrii, kiedy zaczynasz od przybliżenia, które zakłada, że ​​formuły euklidesowe będą działać w pierwszej kolejności. Nie ma nic złego w stosowaniu formuł sferycznych, ale jest to zbędne i nieefektywne obliczeniowo.
whuber
@ Whuber, w drugim przypadku nie jest przybliżony (zastosowanie formuły dwukrotnie dla każdej strony). Masz rację, że mieszanie ich nie miałoby sensu. I rzeczywiście to realizowane, ale będę go zmienić (oh, a powodem jest to, że nie jestem dobry w matematyce :))
Juan