Я разрабатываю таблицу в 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)
);