Double or decimal for latitude/longitude values in C#
Asked Answered
D

4

137

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?

Dearth answered 21/1, 2015 at 13:12 Comment(8)
I'd ask the opposite question: Does the performance difference even matter or can it be ignored?Gard
Decimal for absolute precision. If you are storing millions on them, you can save a bit on size and improve a bit on performance using double, but negligible.Divan
In database you should use "sql spatial data type" to store longitude and latitudeUrsala
Note that the .NET BCL itself uses doubles in its GeoCoordinate class, which is a strong indication that the precision might be sufficient.Gard
NodaTime's TzdbZoneLocation uses double as well.Bludgeon
double vs decimal = 32bits vs 128bits = 4 bytes vs 16 bytesSpongioblast
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.Degression
@Spongioblast Small correction...double is a 64-bit number. msdn.microsoft.com/en-us/library/system.double.aspx#RemarksIsla
S
174

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
Spiracle answered 22/1, 2015 at 16:13 Comment(0)
F
109

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.

Finality answered 21/1, 2015 at 14:49 Comment(3)
Plus one for a detailed and precise explanation.Fife
Exactly the explanation I wanted to see, thanks!Labio
You've convinced me to change from team Decimal to team Double for coordinates. Thanks for the well-constructed comment.Exist
C
7

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.

Clementeclementi answered 21/1, 2015 at 13:36 Comment(1)
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!Tycoon
I
5

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.

Intrigante answered 28/10, 2019 at 12:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.