Double or decimal for latitude/longitude values in C#

别说谁变了你拦得住时间么 提交于 2019-11-28 21:47:00

问题


What is the best data type to use when storing geopositional data in C#? I would use decimal for it's exactness, but operations on decimal floating point numbers are slower then binary floating point numbers (double).

I read that most of the time you won't need any more then 6 or 7 digits of precision for latitude or longitude. Does the inexactness of doubles even matter then or can it be ignored?


回答1:


Go for double, there are several reasons.

  • Trigonometric functions are available only for double
  • Precision of double (range of 100 nanometers) is far beyond anything you'll ever require for Lat/Lon values
  • GeoCoordinate Class and third-Party modules (e.g. DotSpatial) also use double for coordinates



回答2:


A double has up to 15 decimal digits of precision. So, lets assume three of those digits are going to be on the left of the decimal point for lat/long values (max of 180deg). This leaves 12 digits of precision on the right. Since a degree of lat/long is ~111km, 5 of those 12 digits would give us precision to the meter. 3 more digits would give us precision to the millimeter. The remaining 4 digits would get us precision to around 100 nanometers. Since double will win from the perspective of performance and memory, I see no reason to even consider using decimal.




回答3:


I faced this question quite a while ago when i started with spacial programming. I read a book a while ago that led me to this.

//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);

This is the best way when working in your application with spacial data. then to save the data use this in sql

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

else, if you are using something else that isnt sql just convert the point to hexadecimal and store it. I know after a long time using spacial that this is the safest.




回答4:


Double

Combining the answers it is how Microsoft represents it itself in SqlGeography library

[get: Microsoft.SqlServer.Server.SqlMethod(IsDeterministic=true, IsPrecise=true)] public System.Data.SqlTypes.SqlDouble Lat { get; } Property Value SqlDouble A SqlDouble value that specifies the latitude.



来源:https://stackoverflow.com/questions/28068123/double-or-decimal-for-latitude-longitude-values-in-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!