C # 'da enlem / boylam değerleri için çift veya ondalık


98

Coğrafi konum verilerini C # 'da saklarken kullanılacak en iyi veri türü nedir? Kesinliği için ondalık kullanırdım, ancak ondalık kayan noktalı sayılar üzerindeki işlemler, ikili kayan noktalı sayılardan daha yavaştır (çift).

Enlem veya boylam için çoğu zaman 6 veya 7 basamaktan fazlasına ihtiyacınız olmayacağını okudum. Çiftlerin yanlışlığı o zaman önemli mi, yoksa göz ardı edilebilir mi?


6
Tersi soruyu sorardım: Performans farkı önemli mi, yoksa göz ardı edilebilir mi?
Heinzi

1
Veritabanında boylamı ve enlemi saklamak için "sql uzamsal veri türü"
nü kullanmalısınız

8
NET BCL'nin GeoCoordinate sınıfında çiftler kullandığını unutmayın; bu, kesinliğin yeterli olabileceğinin güçlü bir göstergesidir.
Heinzi

1
NodaTime's TzdbZoneLocation da double kullanır.
Rick Davin

4
1) Sabit noktayı düşünürdüm. Sık sık jeo koordinatlarda trigonometrik işlemleri yapmak gerekir ve bu sadece için uygulanması nedeniyle 2) double, doubleen iyi seçim olabilir.
CodesInChaos

Yanıtlar:


121

Devam edin double, birkaç sebep var.

  • Trigonometrik işlevler yalnızca çift
  • Çifte hassasiyet (100 nanometre aralığı), Enlem / Boylam değerleri için ihtiyaç duyacağınız her şeyin çok ötesinde
  • GeoCoordinate Sınıfı ve üçüncü Taraf modülleri (örneğin DotSpatial ) da koordinatlar için double kullanır

76

Bir çift, en fazla 15 ondalık basamak hassasiyetine sahiptir. Öyleyse, bu rakamlardan üçünün, enlem / boylam değerleri için ondalık noktanın solunda olacağını varsayalım (maksimum 180 derece). Bu, sağda 12 basamaklı hassasiyet bırakır. Bir enlem / boylam derecesi ~ 111 km olduğundan, bu 12 haneden 5'i bize ölçümde hassasiyet verecektir. 3 hane daha fazla milimetre hassasiyetini verir. Kalan 4 hane, bizi yaklaşık 100 nanometreye kadar hassaslaştıracaktır. Double, performans ve bellek açısından kazanacağından, ondalık kullanmayı düşünmek için bile bir neden görmüyorum.


3
Artı bir ayrıntılı ve kesin açıklama için.
Najeeb

Tam olarak görmek istediğim açıklama, teşekkürler!
e4stwood

4

Bu soruyla epey bir süre önce uzaysal programlamaya başladığımda karşılaştım. Bir süre önce beni buna yönlendiren bir kitap okudum.

//sql server has a really cool dll that deals with spacial data such like
//geography points and so on. 
//add this namespace
Using Microsoft.SqlServer.Types;

//SqlGeography.Point(dblLat, dblLon, srid)

var lat_lon_point = Microsoft.SqlServer.Types.SqlGeography.Point(lat, lon, 4326);

Bu, uygulamanızda uzaysal verilerle çalışırken en iyi yoldur. sonra verileri kaydetmek için bunu sql'de kullanın

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

Aksi takdirde, sql olmayan başka bir şey kullanıyorsanız, sadece noktayı onaltılıya çevirin ve saklayın. Uzamsal kullanarak uzun bir süre sonra bunun en güvenli olduğunu biliyorum.


LatLonPoint'i bulmakta sorun yaşıyorum, c # projenize hangi referansları veya paketleri eklemek zorunda kaldınız veya hangi 'kullanımlar'? (Oluşturma tablosunun Kimlik modeli / c # kodu için olduğunu varsayarsak, çünkü bu tür SSMS'de de değerlendirilmez). şimdiden teşekkür ederim!
Chris

1

Çift

Yanıtları birleştirmek, Microsoft'un kendisini SqlGeography kitaplığında nasıl temsil ettiğidir.

[get: Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] public System.Data.SqlTypes.SqlDouble Lat {get; } Özellik Değeri SqlDouble Enlemi belirten bir SqlDouble değeri.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.