Двойной или десятичный для значений широты/долготы в С#

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 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 
}

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