Какой лучший способ хранить координаты (долгота/широта, с Карт Google) в SQL Server?

Я разрабатываю таблицу в SQL Server 2008, в которой будет храниться список пользователей и координата Google Maps (долгота и широта).

Мне нужно два поля, или это можно сделать с помощью 1?

Какой лучший (или наиболее распространенный) тип данных для хранения данных такого типа?

Ответ 1

Взгляните на новые типы пространственных данных, которые были введены в SQL Server 2008. Они разработаны для такого рода задач и упрощают и повышают эффективность индексирования и запросов.

Дополнительная информация:

Ответ 2

Справедливое предупреждение! Прежде чем приступать к использованию типа GEOGRAPHY, убедитесь, что вы не планируете использовать Linq или Entity Framework для доступа к данным, поскольку он не поддерживается (по состоянию на ноябрь 2010 г.) и вам будет грустно!

Обновление июль 2017

Для тех, кто сейчас читает этот ответ, он устарел, поскольку он относится к backdated стеку технологий. См. Комментарии для более подробной информации.

Ответ 3

Я не знаю ответа для SQL Server, но...

В MySQL сохраните его как FLOAT( 10, 6 )

Это официальная рекомендация документации разработчика Google.

CREATE TABLE `coords` (
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;

Ответ 4

Я ненавижу быть противоположным тем, кто сказал: "Вот новый тип, пусть он его использует". У новых пространственных типов SQL Server 2008 есть некоторые профи, а именно эффективность, однако вы не можете слепо сказать, что всегда используйте этот тип. Это действительно зависит от некоторых более крупных проблем с изображением.

В качестве примера, интеграция. Этот тип имеет эквивалентный тип в .Net - но как насчет interop? Как насчет поддержки или расширения старых версий .Net? Как разоблачить этот тип на уровне сервиса на других платформах? Как насчет нормализации данных - возможно, вас интересует лат или долго, как отдельные части информации. Возможно, вы уже создали сложную бизнес-логику для обработки long/lat.

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

Хранение long/lat отдельно или в пространственном типе - это жизнеспособные решения, и один может быть предпочтительнее другого в зависимости от ваших собственных обстоятельств.

Ответ 5

Что вы хотите сделать, так это сохранение Широта и долготы в качестве нового пространственного типа SQL2008 → GEOGRAPHY.

Вот скриншот таблицы, который у меня есть.

alt text http://img20.imageshack.us/img20/6839/zipcodetable.png

В этой таблице есть два поля, в которых хранятся данные географии.

  • Граница: это полигон, который является границей почтового индекса
  • CentrePoint: это точка широты/долготы, представляющая визуальную среднюю точку этого многоугольника.

Основная причина, по которой вы хотите сохранить его в базе данных как тип GEOGRAPHY, - это значит, что вы можете использовать все методы SPATIAL → например. Точка в Poly, Расстояние между двумя точками и т.д.

Кстати, мы также используем API Карт Google для извлечения данных lat/long и сохраняем их в нашей базе данных Sql 2008, поэтому этот метод работает.

Ответ 6

Как я это делаю: я храню широту и долготу, а затем у меня есть третий столбец, который является автоматически производным географическим типом первых двух столбцов. Таблица выглядит так:

CREATE TABLE [dbo].[Geopoint]
(
    [GeopointId] BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    [Latitude] float NOT NULL, 
    [Longitude] float NOT NULL, 
    [ts] ROWVERSION NOT NULL, 
    [GeographyPoint]  AS ([geography]::STGeomFromText(((('POINT('+CONVERT([varchar](20),[Longitude]))+' ')+CONVERT([varchar](20),[Latitude]))+')',(4326))) 
)

Это дает вам гибкость пространственных запросов в столбце geoPoint, а также вы можете получить значения широты и долготы по мере необходимости для отображения или извлечения для целей csv.

Ответ 7

SQL Server поддерживает пространственную связанную информацию. Вы можете увидеть больше на http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx.

Альтернативно вы можете хранить информацию в виде двух базовых полей, обычно поплавок - это стандартный тип данных, сообщаемый большинством устройств, и достаточно точный для одного или двух дюймов - более чем подходит для Карт Google.

Ответ 8

ПРИМЕЧАНИЕ. Это недавний ответ на основе последних обновлений SQL-сервера, обновлений стека .NET.

latitute и longitude from google Карты должны храниться как данные Point (note capital P) на сервере SQL под типом географических данных.

Предполагая, что ваши текущие данные хранятся в таблице Sample как varchar под столбцами lat и lon, ниже запрос поможет вам преобразовать в географию

alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go

PS: В следующий раз, когда вы сделаете выбор в этой таблице с данными географии, кроме вкладки "Результаты" и "Сообщения", вы также получите вкладку "Пространственные результаты", как показано ниже для визуализации

вкладка геоданных SSMS

Ответ 9

Если вы просто замените его на URL-адрес, я полагаю, что одно поле будет делать - так что вы можете сформировать URL-адрес, например

http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6

но поскольку это две части данных, я бы сохранил их в отдельных полях

Ответ 10

Храните как float, так и используйте уникальные ключевые слова на них. i.em

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);