2010-02-02 9 views
21

używając wartości szerokości i długości geograficznej (punkt A), próbuję obliczyć kolejny punkt B, oddalony o X metry od 0 radianów od punktu A. Następnie wyświetl punkt B szerokość i długość geograficzna wartości.Oblicz drugi punkt, znając punkt początkowy i odległość

Przykład (Pseudo code):

PointA_Lat = x.xxxx; 
PointA_Lng = x.xxxx; 
Distance = 3; //Meters 
bearing = 0; //radians 

new_PointB = PointA-Distance; 

byłem w stanie obliczyć odległość między dwoma punktami, ale to, co chcę, aby znaleźć to drugi punkt znając odległość i łożysko.

Najlepiej w PHP lub Javascript.

Dzięki

+1

Może to jest pomocne http://www.meridianworlddata.com/Distance-Calculation.asp – stacker

Odpowiedz

38

Wygląda na to, że mierzysz odległość (R) w metrach, a łożysko (theta) przeciwnie do ruchu wskazówek zegara z powodu na wschód. I dla twoich potrzeb (setki metrów) geometria samolotu powinna być wystarczająco dokładna. W tym przypadku,

dx = R*cos(theta) ; theta measured counterclockwise from due east 
dy = R*sin(theta) ; dx, dy same units as R 

Jeśli teta jest mierzona w prawo od na północ (na przykład łożysk kompas) obliczenie dla dx i dy jest nieco inna:

dx = R*sin(theta) ; theta measured clockwise from due north 
dy = R*cos(theta) ; dx, dy same units as R 

w każdym przypadku zmiana stopnia długości i szerokości jest:

delta_longitude = dx/(111320*cos(latitude)) ; dx, dy in meters 
delta_latitude = dy/110540     ; result in degrees long/lat 

różnica pomiędzy stałymi 110540 i 111320 są ze względu na ziemi spłaszczenia (obwody biegunowe i równikowe są różne).

Oto obrobionych przykład, za pomocą parametrów z późniejszym pytanie do Ciebie:

Biorąc pod uwagę położenie startu na długości -87.62788 stopni, szerokość geograficzna 41.88592 stopni, znaleźć współrzędne punktu 500 metrów na północny zachód od początku Lokalizacja.

Jeśli mierzymy kąty w kierunku przeciwnym do ruchu wskazówek zegara od wschodu, "północny zachód" odpowiada na theta = 135 stopni. R to 500 metrów.

dx = R*cos(theta) 
    = 500 * cos(135 deg) 
    = -353.55 meters 

dy = R*sin(theta) 
    = 500 * sin(135 deg) 
    = +353.55 meters 

delta_longitude = dx/(111320*cos(latitude)) 
       = -353.55/(111320*cos(41.88592 deg)) 
       = -.004266 deg (approx -15.36 arcsec) 

delta_latitude = dy/110540 
       = 353.55/110540 
       = .003198 deg (approx 11.51 arcsec) 

Final longitude = start_longitude + delta_longitude 
       = -87.62788 - .004266 
       = -87.632146 

Final latitude = start_latitude + delta_latitude 
       = 41.88592 + .003198 
       = 41.889118 
+0

Dziękuję Jimowi za przykład edycji! Bardzo to doceniam. W pełni rozumiem tę koncepcję teraz. – pppglowacki

+0

Jimk Lewis: Próbowałem użyć twojej formuły tutaj (http://stackoverflow.com/questions/8064930/google-maps-v3-circle-circle-that-i-created-do-not-match) i nie dostałem idealne koło, proszę spojrzeć! – Nyxynyx

+0

Hmm, czy to działa w dowolnym miejscu na świecie? Wygląda na to, że działa tylko w niektórych lokalizacjach. Próbuję wykreślić punkt na południowym wschodzie, a czasem ląduję na północnym zachodzie. – paulwhit

-1

dx = sin (łożysko)
D = cos (łożysko)
X = center.x + dist dx;
y = center.y + dist
dy;

+0

To działałoby w płaszczyźnie, jeśli zamienisz sin() i cos() – stacker

+0

centerX = 41.88592 (szerokość) i centerY = -87,62788 (długość geograficzna) Moja odległość wynosi 500 metrów. Powyższe obliczenia nie dają mi współrzędnych w odległości 500 metrów od mojej pierwotnej lokalizacji. Odległość jest w złym formacie, więc próbuję to sobie wyobrazić. – pppglowacki

+0

prawda, zależy to od konwencji dotyczącej łożyska. jeśli 0 jest "na prawo", a x + jest "na prawo", a następnie zamień grzech i cos ... konwencja nie została podana w pytaniu, więc zrobiłem coś losowo. –

3

To może pomóc, jeśli wiesz, że 3600 sekund łuku to 1 stopień (łac. Lub dług.), Że jest 1852 metrów na milach morskich, a mila morska to 1 sekunda łuku. Oczywiście zależy to od tego, czy odległości są względnie krótkie, w przeciwnym razie musiałbyś użyć trygonometrii sferycznej.

+1

Sferyczne trio to dobry punkt do przebicia. Jeśli odległości są większe niż kilka mil, oderwą się od globu i wzniosą się w powietrze. Jeśli to ma znaczenie, zależy od twojego przypadku użycia, precyzji i celów. Może nie pracuje na globusie, ale na jakiejś płaskiej przestrzeni. – Karl

+0

Karl i akallio, dzięki za wejście. Pracuję na płaskiej powierzchni, a odległość będzie około 500 metrów. – pppglowacki

+0

więc wystarczy potwierdzić, korzystając z powyższej konwersji: 500 metrów = 0,2699784 sekundy łuku? – pppglowacki

2

Oto zaktualizowana wersja za pomocą SWIFT:

let location = CLLocation(latitude: 41.88592 as CLLocationDegrees, longitude: -87.62788 as CLLocationDegrees) 

let distanceInMeter : Int = 500 
let directionInDegrees : Int = 135 

let lat = location.coordinate.latitude 
let long = location.coordinate.longitude 

let radDirection : CGFloat = Double(directionInDegrees).degreesToRadians 

let dx = Double(distanceInMeter) * cos(Double(radDirection)) 
let dy = Double(distanceInMeter) * sin(Double(radDirection)) 

let radLat : CGFloat = Double(lat).degreesToRadians 

let deltaLongitude = dx/(111320 * Double(cos(radLat))) 
let deltaLatitude = dy/110540     

let endLat = lat + deltaLatitude 
let endLong = long + deltaLongitude 

Używanie tego rozszerzenia:

extension Double { 
    var degreesToRadians : CGFloat { 
     return CGFloat(self) * CGFloat(M_PI)/180.0 
    } 
}