2010-06-11 13 views
7

metre içine boylam enlem dönüşümü böyle x/y değerleri için: i "iki geoPoints mesafesi" bazı uygulamaları gördük ama hepsi sadece havayı hesaplamakBen gps pozisyonları eşleştiren bir işlev gerekir

getXYpos(GeoPoint relativeNullPoint, GeoPoint p){ 
    deltaLatitude=p.latitude-relativeNullPoint.latitude; 
    deltaLongitude=p.longitude-relativeNullPoint.longitude; 
    ... 
    resultX=latitude (or west to east) distance in meters from p to relativeNullPoint 
    resultY=longitude (or south to north) distance in meters from p to relativeNullPoint 
} 

hat mesafesi. DeltaLongitude'un doğrudan metreye dönüştürülebileceğini düşünüyorum, ancak delilik, Boylam'a bağlı. Bu sorunun nasıl çözülebileceğini bilen var mı?

cevap

13

, sana latitude ve longitude ters olduğunu düşünüyorum. Boylam ölçümleri X ve enlem ölçümleri Y.

Enlem, kuzey-güney mesafesine dönüşmek kolaydır. 360 derecenin kutupların arasından dünyanın etrafında tam bir daire ve that distance is 40008000 meters olduğunu biliyoruz. Yeryüzünün küresel olmasından kaynaklanan hataları hesaba katmanız gerekmediği sürece, formül deltaLatitude * 40008000/360'dur.

Zor olan bölüm, şüphelendiğiniz gibi, boylamı X'e dönüştürmektir. Enlemine bağlı olduğundan, hangi enlemi kullanacağınıza karar vermeniz gerekir - kaynağınızın enlemini, hedefinizin enlemini veya aralarında rastgele bir noktayı seçebilirsiniz. Ekvatordaki çevre (enlem 0) 40075160 metredir. Belirli bir enlemdeki bir çemberin çevresi, kosinüsle orantılı olacaktır, bu yüzden formül, deltaLongitude * 40075160 * cos(latitude)/360 olacaktır.

Düzeltme: Yorumunuz, boylam formülü ile ilgili bir sorun olduğunu gösterir; cos numaralı çağrıda radyan yerine derece kullanmış olabilirsiniz, bu yaygın bir çaylak hatasıdır. Belirsizlik olmadığından emin olmak için, işte Python'da çalışma kodu.

def asRadians(degrees): 
    return degrees * pi/180 

def getXYpos(relativeNullPoint, p): 
    """ Calculates X and Y distances in meters. 
    """ 
    deltaLatitude = p.latitude - relativeNullPoint.latitude 
    deltaLongitude = p.longitude - relativeNullPoint.longitude 
    latitudeCircumference = 40075160 * cos(asRadians(relativeNullPoint.latitude)) 
    resultX = deltaLongitude * latitudeCircumference/360 
    resultY = deltaLatitude * 40008000/360 
    return resultX, resultY 

X hesaplaması için relativeNullPoint enlemesini kullanmayı seçtim. Bu, birden fazla noktayı aynı boylamla dönüştürdüğünüzde, aynı X değerine sahip olacaklar; kuzey-güney hatları dikey olacaktır.

Tekrar düzenleme yapın: Bunun çok basit bir formül olduğunu ve sınırlamalarını bilmeniz gerektiğini belirtmeliydim. Açıkçası yeryüzü düz değil, bu yüzden onu XY koordinatlarıyla eşleştirmek için herhangi bir girişimde bazı tavizler yer alacaktır. Yukarıda türetilen formül I, dönüştürdüğünüz alanın düz olarak düşünülecek kadar küçük olduğu ve kuzey-güney hatlarının küçük eğriliğinin ve paralel olmayanlığının göz ardı edilebileceği durumlarda en iyi şekilde çalışır. Projeksiyonları haritalamak için bütün bir bilim var; Bazı olasılıklar görmek istiyorsanız iyi bir başlangıç ​​noktası Wikipedia olacaktır. Bu spesifik projeksiyon, bazı eklenmiş ölçekleme ile the Equirectangular projection olarak bilinir.

+0

Tamam, bunu denedim, ve enlem hesaplaması çok doğrudur :) ama boylam-metre değerleri her zaman enlemin testi için büyük olan 1.3 faktörüdür. Bence bu faktöre göre bölünmesi iyi bir fikir değil çünkü muhtemelen farklı enlemler için farklılık gösterebilir, belki de dünya çevresinin mevcut enlemlere göre hesaplanması gerekir? –

+0

@Sponge, güncellemeyi kontrol edin. –

+0

çok teşekkürler! harika çalışıyor :) –

1

PHP, Java ve Javascript yapmak bu, örneğin için jstott.me.uk üzerinde kütüphaneler vardır Harvesine fonksiyonunun bir Java uygulaması buldum

GÜNCELLEME Başlangıç ​​olarak

var lld1 = new LatLng(40.718119, -73.995667); // New York 
document.write("New York Lat/Long: " + lld1.toString() + "<br />"); 
var lld2 = new LatLng(51.499981, -0.125313); // London 
document.write("London Lat/Long: " + lld2.toString() + "<br />"); 
var d = lld1.distance(lld2); 
document.write("Surface Distance between New York and London: " + d + "km"); 
İlgili konular