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

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.


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.


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)


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ć.

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 )


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.