Відповіді:
Погляньте на нові просторові типи даних, які були представлені в SQL Server 2008. Вони розроблені для такого роду завдань і роблять індексацію та запити набагато простішими та ефективнішими.
Більше інформації:
Справедливе попередження! Перш ніж приймати поради щодо використання типу GEOGRAPHY, переконайтесь, що ви не плануєте використовувати Linq або Entity Framework для доступу до даних, оскільки це не підтримується (станом на листопад 2010 року), і вам буде сумно!
Оновлення липня 2017 року
Для тих, хто зараз читає цю відповідь, вона застаріла, оскільки вона посилається на застарілий стек технологій. Дивіться коментарі для більш детальної інформації.
Я не знаю відповіді для SQL Server, але ...
У MySQL збережіть його якFLOAT( 10, 6 )
Це офіційна рекомендація з документації для розробників Google .
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
lat
і lng
перевершує georgraphy
навіть у індексах високої щільності в SQL 2014. Наприклад: знайти всю точку - це прямокутник. Тільки я не впевнений, я бачу, що в Google Maps зараз використовується 7 замість 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.
Point
замість цього STGeomFromText
. Наприклад: [geography]::Point([Latitude], [Longitude], 4326)
.
Я ненавиджу бути противником тим, хто сказав "ось новий тип, давайте скористаємося цим". Нові просторові типи SQL Server 2008 мають певні плюси - а саме ефективність, однак не можна сліпо сказати, що завжди використовуйте цей тип. Це дійсно залежить від декількох проблем з більшою картиною.
Як приклад - інтеграція. Цей тип має еквівалентний тип у .Net - а як же інтероп? Що щодо підтримки чи розширення старих версій .Net? Що щодо експонування цього типу на рівні сервісу на інших платформах? Як щодо нормалізації даних - можливо, вас цікавлять лати або довгі, як окремі відомості. Можливо, ви вже написали складну ділову логіку, щоб обробляти довго / лат.
Я не кажу, що не слід використовувати просторовий тип - у багатьох випадках слід. Я просто кажу, що вам слід задати кілька критичніших питань, перш ніж піти по цьому шляху. Щоб я найбільш точно відповідав на ваше запитання, мені потрібно було б дізнатися більше про вашу конкретну ситуацію.
Зберігання довгих / лат окремо або в просторовому типі є життєздатними рішеннями, і одне може бути кращим перед іншим залежно від ваших власних обставин.
Що ви хочете зробити, це зберігати широту та довготу як новий просторовий тип SQL2008 -> ГЕОГРАФІЯ.
Ось знімок екрана таблиці, який у мене є.
alt text http://img20.imageshack.us/img20/6839/zipcodetable.png
У цій таблиці ми маємо два поля, в яких зберігаються дані географії.
Основна причина, чому ви хочете зберегти його в базі даних як тип GEOGRAPHY, - це потім ви можете використовувати від неї всі СПЕЦІАЛЬНІ методи -> напр. Точка в Полі, Відстань між двома точками тощо.
До речі, ми також використовуємо API Карт Google для отримання даних lat / long і зберігаємо їх у нашому БД Sql 2008 - таким чином цей метод працює.
SQL Server підтримує інформацію, пов'язану з простором. Більше ви можете побачити на веб- сайті http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx .
Ви також можете зберігати інформацію як два основних поля, зазвичай поплавок - це стандартний тип даних, про який повідомляє більшість пристроїв, і достатньо точний протягом дюйма або двох - більш ніж достатньо для Карт Google.
ПРИМІТКА . Це нещодавня відповідь, заснована на останніх серверах SQL, оновленнях стеків .NET
латитут і довгота з Google Maps повинні зберігатися у вигляді даних Point (замість капіталу P) на SQL-сервері під типом географічних даних.
Якщо припустити, що ваші поточні дані зберігаються в таблиці Sample
як варчар під стовпцями, lat
а lon
нижче запит допоможе вам перейти до географії
alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go
PS: Наступного разу, коли ви будете робити вибір у цій таблиці з географічними даними, крім вкладки «Результати» та «Повідомлення», ви також отримаєте вкладку «Просторові результати», як показано нижче для візуалізації.
Якщо ви використовуєте Entity Framework 5 <, ви можете використовувати DbGeography
. Приклад з MSDN:
public class University
{
public int UniversityID { get; set; }
public string Name { get; set; }
public DbGeography Location { get; set; }
}
public partial class UniversityContext : DbContext
{
public DbSet<University> Universities { get; set; }
}
using (var context = new UniversityContext ())
{
context.Universities.Add(new University()
{
Name = "Graphic Design Institute",
Location = DbGeography.FromText("POINT(-122.336106 47.605049)"),
});
context. Universities.Add(new University()
{
Name = "School of Fine Art",
Location = DbGeography.FromText("POINT(-122.335197 47.646711)"),
});
context.SaveChanges();
var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)");
var university = (from u in context.Universities
orderby u.Location.Distance(myLocation)
select u).FirstOrDefault();
Console.WriteLine(
"The closest University to you is: {0}.",
university.Name);
}
https://msdn.microsoft.com/en-us/library/hh859721(v=vs.113).aspx
Щось, з чим я боровся тоді, я почав використовувати DbGeography
це coordinateSystemId
. Дивіться відповідь нижче для відмінного пояснення та джерела коду нижче.
public class GeoHelper
{
public const int SridGoogleMaps = 4326;
public const int SridCustomMap = 3857;
public static DbGeography FromLatLng(double lat, double lng)
{
return DbGeography.PointFromText(
"POINT("
+ lng.ToString() + " "
+ lat.ToString() + ")",
SridGoogleMaps);
}
}
Якщо ви просто збираєтеся замінити його на URL-адресу, я вважаю, що це зробить одне поле - щоб ви могли сформувати подібну URL-адресу
http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6
але оскільки це два фрагменти даних, я б зберігав їх в окремих полях
Зберігайте як float, так і використовуйте унікальні ключові слова на них.i.em
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
House A
і переїде до House B
будинку, де раніше жила Аліса. Незабаром Боб не зможе зберегти свою адресу (місцезнаходження), оскільки Аліса ще не оновлювала її - або ніколи не буде.