Какой идеальный тип данных использовать при хранении широты / долготы в базе данных MySQL?

Прежде всего, самая важная зависимость каждой динамически связанной программы - это компоновщик. Все библиотеки должны соответствовать версии компоновщика.

Давайте возьмем простой пример: у меня есть система новостей ubuntu, в которой я запускаю некоторую программу (в моем случае это компилятор D - ldc2). Я хотел бы запустить его на старой CentOS, но из-за старой библиотеки glibc это невозможно. Я получил

ldc2-1.5.0-linux-x86_64/bin/ldc2: /lib64/libc.so.6: version `GLIBC_2.15' not found (required by ldc2-1.5.0-linux-x86_64/bin/ldc2)
ldc2-1.5.0-linux-x86_64/bin/ldc2: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ldc2-1.5.0-linux-x86_64/bin/ldc2)

Мне нужно скопировать все зависимости от ubuntu до centos. Правильный метод следующий:

Сначала давайте проверим все зависимости:

ldd ldc2-1.5.0-linux-x86_64/bin/ldc2 
    linux-vdso.so.1 =>  (0x00007ffebad3f000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f965f597000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f965f378000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f965f15b000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f965ef57000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f965ec01000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f965e9ea000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f965e60a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f965f79f000)

linux-vdso.so.1 не является реальной библиотекой, и нам не нужно заботиться об этом.

/lib64/ld-linux-x86-64.so.2 является компоновщиком, который используется linux do, связывает исполняемый файл со всеми динамическими библиотеками.

Остальные файлы являются реальными библиотеками, и все они вместе с компоновщиком должны быть скопированы где-то в центрах.

Предположим, что все библиотеки и компоновщики находятся в каталоге «/ mylibs».

ld-linux-x86-64.so.2 - как я уже сказал, - это компоновщик. Это не динамическая библиотека, а статический исполняемый файл. Вы можете запустить его и увидеть, что у него даже есть некоторые параметры, например, -library-path (я вернусь к нему).

В linux динамически связанная программа может быть отправлена ​​только по ее имени, например

/bin/ldc2

Linux загружает такую ​​программу в ОЗУ и проверяет, какой компоновщик установлен для нее. Обычно в 64-битной системе это /lib64/ld-linux-x86-64.so.2 (в вашей файловой системе это символическая ссылка на реальный исполняемый файл). Затем linux запускает компоновщик и загружает динамические библиотеки.

Вы также можете немного изменить это и сделать такой трюк:

/mylibs/ld-linux-x86-64.so.2 /bin/ldc2

Это метод принудительного использования linux конкретный линкер.

И теперь мы можем вернуться к упомянутому ранее параметру -library-path

/mylibs/ld-linux-x86-64.so.2 --library-path /mylibs /bin/ldc2

Он запустит ldc2 и загрузит динамические библиотеки из /mylibs.

Это метод вызова исполняемого файла с выбранными (не системными) библиотеками.

414
задан Cœur 3 December 2018 в 04:53
поделиться

9 ответов

Используйте пространственные расширения MySQL с GIS.

155
ответ дан Kirk Strauser 3 December 2018 в 04:53
поделиться

FLOAT должен дать Вам всю точность, в которой Вы нуждаетесь и лучше для функций сравнения, чем хранение каждой координаты как строка и т.п.

, Если Ваша версия MySQL ранее, чем 5.0.3, Вы, возможно, должны принять во внимание определенные ошибки сравнения с плавающей точкой как бы то ни было.

До MySQL 5.0.3, столбцы DECIMAL снабжают значения точной точностью, потому что они представлены как строки, но вычисления на Десятичных значениях сделаны с помощью операций с плавающей точкой. С 5.0.3, MySQL выполняет ДЕСЯТИЧНЫЕ операции с точностью 64 десятичных цифр, которые должны решить наиболее распространенные проблемы погрешности когда дело доходит до столбцов DECIMAL

-4
ответ дан ConroyP 3 December 2018 в 04:53
поделиться

Вычисления Lat Long требуют точности, так используйте некоторый тип десятичного типа и сделайте точность по крайней мере 2 выше, чем число, которое Вы сохраните для выполнения математических вычислений. Я не знаю о своих sql типах данных, но у людей SQL-сервера часто используют плавание или реальный вместо десятичного числа и попадают в беду, потому что это, оцененные числа не реальные. Поэтому просто удостоверьтесь тип данных, который Вы используете, истинный десятичный тип и не плавающий десятичный тип, и необходимо быть в порядке.

-2
ответ дан BCS 3 December 2018 в 04:53
поделиться

Когда я сделал это для базы данных навигации, созданной из ARINC424, я сделал изрядное количество тестирования и оглядывания назад на код, я использовал ДЕСЯТИЧНОЕ ЧИСЛО (18,12) (На самом деле ЧИСЛОВОЕ (18,12), потому что это был firebird).

Плавания и удваиваются, не так точны и может привести к погрешностям округления, которые могут быть очень плохой вещью. Я не могу помнить, нашел ли я какие-либо реальные данные, которые имели проблемы - но я вполне уверен, что неспособность сохранить точно в плавании или двойном могла вызвать проблемы

Дело в том, что при использовании градусов или радианов мы знаем диапазон значений - и для дробной части нужно большинство цифр.

MySQL Spatial Extensions является хорошей альтернативой, потому что они следуют Модель Геометрии OpenGIS. Я не использовал их, потому что я должен был сохранить свою базу данных портативной.

70
ответ дан Richard Harrison 3 December 2018 в 04:53
поделиться

Пространственные Расширения MySQL являются наилучшим вариантом, потому что у Вас есть полный список пространственных операторов и индексов в Вашем распоряжении. Пространственный индекс позволит Вам выполнять основанные на расстоянии вычисления очень быстро. Следует иметь в виду, что с 6,0, Пространственное Расширение является все еще неполным. Я не подавляю MySQL Spatial, только сообщая ловушек, прежде чем Вы станете слишком далекими вперед на этом.

, Если Вы имеете дело строго с точками и только функцией РАССТОЯНИЯ, это прекрасно. Если необходимо сделать какие-либо вычисления с Полигонами, Строками или Буферизированными Точками, пространственные операторы не обеспечивают точные результаты, если Вы не используете "связать" оператор. Посмотрите предупреждение наверху 21.5.6 . Отношения те, которые содержат, в, или пересекаются, используют MBR, не форму точной геометрии (т.е. Эллипс рассматривают как Прямоугольник).

кроме того, расстояния в MySQL Spatial находятся в тех же единицах как Ваша первая геометрия. Это означает, используете ли Вы Десятичные градусы, тогда Ваши дистанционные измерения находятся в Десятичных градусах. Это сделает очень трудным получить точные результаты, поскольку Вы получаете furthur от экватора.

74
ответ дан James Schek 3 December 2018 в 04:53
поделиться

Мы храним широту/долготу X 1,000,000 в нашей базе данных оракула, поскольку ЧИСЛА для предотвращения округляют ошибки с, удваивается.

, Учитывая, что широта/долгота к 6-му десятичному разряду была точностью на 10 см, которая была всем, которое нам было нужно. Много других баз данных также хранят lat/long к 6-му десятичному разряду.

7
ответ дан 3 December 2018 в 04:53
поделиться

Пространственные функции в PostGIS намного более функциональны (т.е. не ограниченные к операциям BBOX), чем те в MySQL пространственные функции. Проверьте его: текст ссылки

3
ответ дан Dylan 3 December 2018 в 04:53
поделиться

Я предлагаю, чтобы Вы использовали Тип данных float для SQL Server.

0
ответ дан 22 November 2019 в 23:24
поделиться

в зависимости от вашего приложения, я предлагаю использовать пространственные ключи FLOAT (9,6)

, которые предоставят вам больше возможностей, но в производственных тестах float намного быстрее, чем пространственные ключи. (0,01 VS 0,001 в AVG)

4
ответ дан 22 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: