ChatGPT解决这个技术问题 Extra ChatGPT

Double or decimal for latitude/longitude values in C#

What is the best data type to use when storing geopositional data in C#? I would use decimal for its 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 than 6 or 7 digits of precision for latitude or longitude. Does the inexactness of doubles even matter then or can it be ignored?

I'd ask the opposite question: Does the performance difference even matter or can it be ignored?
In database you should use "sql spatial data type" to store longitude and latitude
Note that the .NET BCL itself uses doubles in its GeoCoordinate class, which is a strong indication that the precision might be sufficient.
NodaTime's TzdbZoneLocation uses double as well.
1) I'd consider fixed-point. 2) Since you often need to do trigonometric operations on geo coordinates, and those are only implemented for double, double might be the best fit.

W
Wernfried Domscheit

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


M
MarkPflug

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.


Plus one for a detailed and precise explanation.
Exactly the explanation I wanted to see, thanks!
J
Jonny

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.


I am having trouble finding LatLonPoint, what references or packages did you have to include or what 'usings' in your c# project? (assuming the create table was for Identity model / c# code, because that type doesn't evaluate in SSMS either). thank you in advance!
a
alex.peter

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.


A
Abuzar G

If you are using .net ef core, I would recommend you the NetTopologySuite library. Read the full documentation at below link: https://docs.microsoft.com/en-us/ef/core/modeling/spatial


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now