2010-07-16 27 views
5

Sadece başlangıç, enlem ve boylamı alan ve sınırlama kutusunu (max lat, min lat, max lon, min lon) bulan C# sınıfını bulmak istiyorum. Burada SO üzerinde başka benzer sorular var ama bunların hiçbiri gerçekten buna cevap vermiyor ve C# içinde olmayanlar.enlem ve boylam sınırlayıcı kutu?

Yardım.

+5

Birkaç ilgili gönderiye baktığımızda, C# 'daki kendi uygulamanızı bir araya getirmek için yeterli bilgi ve referans var gibi görünüyor. Birisinin sizin için kodu yazmasını istemiyorsanız, bunu yapmak zorunda kalmazsınız, burada çok şansınız olmayabilir. –

+0

Mesajlara belirli linkler olmadan, yorumunuzu mutlu bir şekilde görmezden geleceğim. Aramamı yaptım, burada değil C# –

+4

Peki, bu sayfanın sağ tarafındaki İlgili Bağlantıların ilkini sizin için kopyalamama izin ver. http://stackoverflow.com/questions/1648917/given-a-latitude-and-longitude-and-distance-i-want-to-find-a-bounding-box Bunun üzerinden ilerleyin. En azından Java'daki bir uygulamaya atıfta bulunmanın yanı sıra, problemle ilgili matematiksel yaklaşımlar hakkında birkaç makale bulun. İstediğiniz tam uygulamayı tercih ettiğiniz dilde bulamıyor olabilirsiniz. Buradaki düşünce, hakkında düşünmeye yardımcı olmak, insanların sizin için düşünme ve kodlama yapmaması, sonra sadece derleyen ilk sınıfı kullanmasıdır. –

cevap

9

Burada için soruları bulunmaktadır. Python here'daki orijinali yazan Federico A. Ramponi'ye Kudos.

public class MapPoint 
{ 
    public double Longitude { get; set; } // In Degrees 
    public double Latitude { get; set; } // In Degrees 
} 

public class BoundingBox 
{ 
    public MapPoint MinPoint { get; set; } 
    public MapPoint MaxPoint { get; set; } 
}   

// Semi-axes of WGS-84 geoidal reference 
private const double WGS84_a = 6378137.0; // Major semiaxis [m] 
private const double WGS84_b = 6356752.3; // Minor semiaxis [m] 

// 'halfSideInKm' is the half length of the bounding box you want in kilometers. 
public static BoundingBox GetBoundingBox(MapPoint point, double halfSideInKm) 
{    
    // Bounding box surrounding the point at given coordinates, 
    // assuming local approximation of Earth surface as a sphere 
    // of radius given by WGS84 
    var lat = Deg2rad(point.Latitude); 
    var lon = Deg2rad(point.Longitude); 
    var halfSide = 1000 * halfSideInKm; 

    // Radius of Earth at given latitude 
    var radius = WGS84EarthRadius(lat); 
    // Radius of the parallel at given latitude 
    var pradius = radius * Math.Cos(lat); 

    var latMin = lat - halfSide/radius; 
    var latMax = lat + halfSide/radius; 
    var lonMin = lon - halfSide/pradius; 
    var lonMax = lon + halfSide/pradius; 

    return new BoundingBox { 
     MinPoint = new MapPoint { Latitude = Rad2deg(latMin), Longitude = Rad2deg(lonMin) }, 
     MaxPoint = new MapPoint { Latitude = Rad2deg(latMax), Longitude = Rad2deg(lonMax) } 
    };    
} 

// degrees to radians 
private static double Deg2rad(double degrees) 
{ 
    return Math.PI * degrees/180.0; 
} 

// radians to degrees 
private static double Rad2deg(double radians) 
{ 
    return 180.0 * radians/Math.PI; 
} 

// Earth radius at a given latitude, according to the WGS-84 ellipsoid [m] 
private static double WGS84EarthRadius(double lat) 
{ 
    // http://en.wikipedia.org/wiki/Earth_radius 
    var An = WGS84_a * WGS84_a * Math.Cos(lat); 
    var Bn = WGS84_b * WGS84_b * Math.Sin(lat); 
    var Ad = WGS84_a * Math.Cos(lat); 
    var Bd = WGS84_b * Math.Sin(lat); 
    return Math.Sqrt((An*An + Bn*Bn)/(Ad*Ad + Bd*Bd)); 
} 
+0

Burada halfSideInKm nedir? –

+0

@DharmikBhandari: İstediğiniz sınırlama kutusunun yarı uzunluğudur. –

+0

KM'de mesafeyi geçmeli miyim? –

-1

Yalnızca bir başlangıç ​​enlemi, boylam ve yükseklik derecesine sahipseniz, yalnızca boşlukta tek bir nokta tanımladığınız için sınırlayıcı kutu yoktur. Herhangi bir dikdörtgen/sınırlayıcı kutu tanımlamak için en az iki noktaya ihtiyaç duyar!

+0

Evet, ancak bu noktanın etrafındaki sınırlayıcı kutuyu – samiq

+0

noktasına kadar olan mesafe ile oluşturmak için mesafenin anlamı 'noktanın yarıçapı kadar olan mesafe' bilgisi olmaksızın, 'işaret ettiğim anlamsızdır. Coğrafi noktalar kullanılırken mesafe genellikle rakıma işaret eder (yeryüzü mesafesi). Tüm sahip olduğunuz noktalar lat ve lng ve irtifa yok ise o zaman kutuya sığacak şekilde nasıl hesaplayabilirsiniz !? – Fraser

4

İki yıllık bir soruyu diriltiyorum, ama herkesin Google'dan gelmesi durumunda, tam olarak bunu ve biraz daha fazlasını yapan bir C# sınıfı kitaplık yazdım. Kodu barındırmak için bir Github repository oluşturdum ve kısa süre içinde bir blog yazısı yazacak.

Geolocation repository

+1

Teşekkürler Scott, bu kodu oldukça yararlı buldu. –

+0

Sadece coğrafi kodlamayı değil, tüm Google Haritalar API'sını da tamamlayan başka bir projeye de göz atmak isteyebilirsiniz: https://github.com/maximnovak/google-maps. – Pete

+0

'u iptal etmeye değer olabilir. Aslında bu repo, Google API’ndan hiçbir şekilde yararlanamamaktadır. Sadece, mesafe, yön, sınırlayıcı kutuları, vb. Belirlemek için matematiksel formülleri kullanır. Ancak, geocoding konumlarını ele alan bir Grider (Github da) yazdım. Yine de bahsettiğin repo'yu kontrol edeceğim, ilginç. Teşekkürler! – Scott

İlgili konular