2015-01-21 4 views
47

Каков наилучший тип данных, который следует использовать при хранении геопозиционных данных на C#? Я бы использовал десятичное значение для его точности, но операции с десятичными числами с плавающей запятой медленнее, чем двоичные числа с плавающей запятой (double).Двойной или десятичный знак для значений широты/долготы в C#

Я читал, что большую часть времени вам больше не понадобится 6 или 7 цифр точности для широты или долготы. Нечеткость двойников даже имеет значение или может быть проигнорирована?

+3

Я задал бы противоположный вопрос: имеет ли разница в производительности даже материю или ее можно игнорировать? – Heinzi

+0

Десятичное значение для абсолютной точности. Если вы сохраняете миллионы на них, вы можете немного сохранить размер и немного улучшить производительность, используя двойной, но незначительный. –

+1

В базе данных вы должны использовать «пространственный тип данных sql» для хранения долготы и широты –

ответ

3

Я столкнулся с этим вопросом довольно давно, когда начал с пространственного программирования. Я прочитал книгу некоторое время назад, что привело меня к этому.

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

Это самый лучший способ при работе в приложении с пространственными данными. затем сохранить данные использовать это в SQL

CREATE TABLE myGeoTable 
{ 
LatLonPoint GEOMETRY 
} 

еще, если вы используете что-то другое, что разве только SQL преобразовать точку в шестнадцатеричные и сохранить его. Через долгое время я знаю, что это самое безопасное.

24

Двойник имеет до 15 десятичных цифр точности. Итак, предположим, что три из этих цифр будут находиться слева от десятичной точки для значений lat/long (макс. 180deg). Это оставляет 12 цифр точности справа. Поскольку степень lat/long составляет ~ 111 км, 5 из этих 12 цифр будут давать точность счетчику. Еще 3 цифры дали бы точность миллиметра. Остальные 4 цифры получат точность до примерно 100 нанометров. Поскольку двойной выигрыш с точки зрения производительности и памяти, я не вижу причин даже рассматривать использование десятичной дроби.

+0

Я убежден (период) –

64

Идите в два раза, есть несколько причин.

  • тригонометрические функции доступны только для двойной
  • Точность двойных далеко за все, что вы когда-либо потребуется для Lat/Lon значения
  • сторонних модулей (например, DotSpatial) также использовать двойной для координат
Смежные вопросы