Подвійний або десятковий для значень широти / довготи в C #


96

Який найкращий тип даних використовувати при зберіганні геопозиційних даних у C #? Я б використав десятковий для його точності, але операції з десятковими числами з плаваючою комою є повільнішими, ніж двійкові числа з плаваючою комою (подвійні).

Я читав, що більшу частину часу вам не знадобиться більше 6 або 7 цифр точності для широти чи довготи. Чи має значення тоді неточність подвійних взагалі, чи її можна ігнорувати?


6
Я поставив би протилежне запитання: чи різниця в продуктивності взагалі має значення, або її можна ігнорувати?
Хайнзі

1
У базі даних слід використовувати "тип просторових даних sql" для зберігання довготи та широти
azhar_SE_nextbridge

8
Зверніть увагу, що сам .NET BCL використовує подвійні у своєму класі GeoCoordinate , що є вагомим показником того, що точність може бути достатньою.
Хайнзі

1
TzdbZoneLocation від NodaTime також використовує подвійний.
Рік Девін,

4
1) Я б розглянув фіксовану точку. 2) Оскільки вам часто потрібно виконувати тригонометричні операції з гео координатами, і вони реалізуються лише для double, doubleможливо, найкраще підходить.
CodesInChaos

Відповіді:


120

Погодьтесь double, є кілька причин.

  • Тригонометричні функції доступні лише для подвійних
  • Точність подвоєння (діапазон 100 нанометрів) набагато перевищує все, що вам коли-небудь знадобиться для значень Lat / Lon
  • Класи GeoCoordinate та сторонні модулі (наприклад, DotSpatial ) також використовують подвійний для координат

75

Подвійний має до 15 десяткових цифр точності. Отже, припустимо, що три з цих цифр будуть ліворуч від десяткової коми для значень lat / long (макс. 180deg). Це залишає 12 цифр точності праворуч. Оскільки градус широти / довжини становить ~ 111 км, 5 із цих 12 цифр дадуть нам точність вимірювача. Ще 3 цифри дадуть нам точність до міліметра. Решта 4 цифри дадуть нам точність приблизно до 100 нанометрів. Оскільки double виграє з точки зору продуктивності та пам'яті, я не бачу підстав навіть роздумувати про використання десяткової.


2
Плюс один для детального та точного пояснення.
Najeeb

4

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

//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, просто перетворіть точку в шістнадцяткову і збережіть її. Після довгого використання Spacial я знаю, що це найбезпечніше.


У мене виникають проблеми з пошуком LatLonPoint, які посилання чи пакети вам доводилося включати чи які «використання» у вашому проекті c #? (припускаючи, що таблиця створення була для ідентифікаційної моделі / коду # c, оскільки цей тип також не обчислюється в SSMS). наперед дякую!
Кріс,

0

Подвійний

Поєднуючи відповіді, так Microsoft представляє себе в бібліотеці SqlGeography

[get: Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] public System.Data.SqlTypes.SqlDouble Lat {get; } Значення властивості SqlDouble Значення SqlDouble, яке вказує широту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.