2016-04-13 20 views
0

bir açı ve mesafe koordinat hesapliyorsunuz Bir Ipoint bu uzantı yöntemi yazdım. I 0, 90, 180 ve 270 'lik bir açıda koyarak zamanbir koordinat

public static IPoint Offset(this IPoint point, double angle, double distanceInMeters) 
{ 
    var radians = Math.PI * angle/180; 
    var distanceX = distanceInMeters * Math.Cos(radians); 
    var distanceY = distanceInMeters * Math.Sin(radians); 
    var earthRadius = 6371000; 

    var y = point.Y + ((distanceY/earthRadius) * 180/Math.PI); 
    var x = point.X + ((distanceX/(earthRadius * Math.Cos(y * 180/Math.PI))) * 180/Math.PI); 


    return new Point(x, y); 
} 

Daha sonra, bir çıkış noktası olan belirli bir mesafede koordinat dönüş iyi çalışır. Ama tam olarak Kuzey, Doğu gibi noktalara işaret etmeyen bir açıya girmeye başladığımda yanlış mesafeler alıyorum.

Nerede hata yapıyorum? Alternatif kullanmak için bazı kütüphaneler var mı?

+0

Bu konuda gerçekten emin değilim ... ama ... – Ian

+0

'int açısı 'potansiyel tamsayı bölmesine dikkat edin ??? 'Çift açı' - '30.51' derece –

+0

'dır. * Hata ayıklama * .First, neyin ters gittiği - eğer açı' 90 'ise Tamam, küçük * bozukluğu *,' 91' derecesini söyleyin. : distanceX'te ekstra * kazanç * veya * kayıp * var mı? 'DistanceY' hakkında ne dersiniz? 89 dereceye kadar devam edin; Sonra koymak '45' - * tam * önce' 0' ve '90' olgu ... –

cevap

0

bu formülü deneyin. Düşündüğüm üzere, enlem ve boylamı radyanlara ve sonra da derecelere geri vermelisiniz.

public static Point Offset(this Point point, double angle, double distanceInMeters) 
    { 
     double rad = Math.PI * angle/180; 

     double xRad = Math.PI * point.X/180; // convert to radians 
     double yRad = Math.PI * point.Y/180; 

     double R = 6378100; //Radius of the Earth in meters 
     double x = Math.Asin(Math.Sin(xRad) * Math.Cos(distanceInMeters/ R) 
           + Math.Cos(xRad) * Math.Sin(distanceInMeters/ R) * Math.Cos(rad)); 

     double y = yRad + Math.Atan2(Math.Sin(rad) * Math.Sin(distanceInMeters/ R) * Math.Cos(xRad), Math.Cos(distanceInMeters/ R) - Math.Sin(xRad) * Math.Sin(x)); 

     x = x * 180/Math.PI; // convert back to degrees 
     y = y * 180/Math.PI; 

     return new Point(x, y); 
    } 
+0

azından ben bildiğim kadarıyla gördüğünüz gibi, sonuçlar eskisinin aynıdır, formülünüzü çalıştı. İki koordinat arasındaki mesafeyi hesaplamak için bir formül biliyor musunuz, böylece sonucu doğrulamak için bir test yazabilirim. Şu anda google haritalar içine noktaları çizme ve doğrulamak için ölçüm araçlarını kullanın ... –

+0

@RuneJensen merak ediyorum, bunu nasıl test edersiniz açıklayabilir misiniz? Belki rulman – Valentin

+0

kurma ile ilgili bir sorun [bunu yaparım] (http://s22.postimg.org/mccohv0r5/map.png) –

İlgili konular