답변:
SQL Server 2008에 도입 된 새로운 공간 데이터 유형을 살펴보십시오. 이러한 유형의 작업을 위해 설계되었으며 인덱싱 및 쿼리를 훨씬 쉽고 효율적으로 수행 할 수 있습니다.
추가 정보:
공정한 경고! GEOGRAPHY 유형을 사용하라는 조언을 받기 전에 Linq 또는 Entity Framework를 사용하여 데이터에 액세스 할 계획이 없는지 확인하십시오. 2010 년 11 월 현재 지원되지 않으므로 슬프게 될 것입니다!
2017 년 7 월 업데이트
지금이 답변을 읽는 사람들에게는 백 데이트 기술 스택을 참조하므로 더 이상 사용되지 않습니다. 자세한 내용은 주석을 참조하십시오.
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
outperform 실제 사례가 있습니다 georgraphy
. 예를 들어, 모든 점 찾기가 직사각형에 속합니다. 확실하지 않습니다. 이제 Google지도에서 6 자리 대신 7 자리를 사용한다는 것을 알 수 있습니다.
내가하는 방법 : 위도 와 경도를 저장 한 다음 첫 번째 두 열의 자동 파생 지리 유형 인 세 번째 열이 있습니다. 표는 다음과 같습니다.
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에서 동등한 유형을 가지고 있지만 interop은 어떻습니까? .Net의 이전 버전을 지원하거나 확장하는 것은 어떻습니까? 이 유형을 서비스 계층 전체에서 다른 플랫폼에 노출하는 것은 어떻습니까? 데이터 정규화는 어떻습니까-아마도 당신은 위도 또는 경도 독립형 정보에 관심이있을 것입니다. long / lat을 처리하는 복잡한 비즈니스 로직을 이미 작성했을 것입니다.
공간 유형을 사용해서는 안된다는 것이 아닙니다. 많은 경우에 사용해야합니다. 그 길을 가기 전에 좀 더 중요한 질문을해야한다고 말하는 것입니다. 귀하의 질문에 가장 정확하게 대답하려면 귀하의 특정 상황에 대해 더 많이 알아야합니다.
long / lat을 별도로 저장하거나 공간 유형으로 저장하는 것은 모두 실행 가능한 솔루션이며 자신의 상황에 따라 하나가 다른 것보다 선호 될 수 있습니다.
원하는 것은 위도와 경도를 새로운 SQL2008 Spatial 유형-> GEOGRAPHY로 저장하는 것입니다.
여기 제가 가지고있는 테이블의 스크린 샷이 있습니다.
대체 텍스트 http://img20.imageshack.us/img20/6839/zipcodetable.png
이 테이블에는 지리 데이터를 저장하는 두 개의 필드가 있습니다.
GEOGRAPHY 유형으로 데이터베이스에 저장하려는 주된 이유는 모든 SPATIAL 메소드를 활용할 수 있기 때문입니다. Point in Poly, 두 점 사이의 거리 등
BTW, 우리는 또한 Google의 Maps API를 사용하여 위도 / 경도 데이터를 검색하고 Sql 2008 DB에 저장하므로이 방법이 작동합니다.
SQL Server는 공간 관련 정보를 지원합니다. http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx 에서 자세한 내용을 볼 수 있습니다 .
또는 정보를 두 개의 기본 필드로 저장할 수 있습니다. 일반적으로 부동 소수점은 대부분의 장치에서보고하는 표준 데이터 유형이며 Google지도에 적합한 것보다 1 ~ 2 인치 이내로 정확합니다.
참고 : 이것은 최근 SQL 서버, .NET 스택 업데이트를 기반으로 한 최근 답변입니다.
구글 맵의 위도와 경도는 지리 데이터 유형으로 SQL 서버에 Point (note capital P) 데이터로 저장되어야합니다.
테이블에 저장된 현재 데이터를 가정 할 Sample
열에서 VARCHAR로 lat
및 lon
쿼리 아래 것은, 당신이 지리로 변환 도움이 될 것입니다
alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go
추신 : 다음 번에 결과 및 메시지 탭과는 별도로 지리 데이터로이 테이블을 선택하면 시각화를 위해 아래와 같은 공간 결과 탭도 표시됩니다.
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);
}
}
둘 다 float로 저장하고 고유 한 키워드를 사용합니다.
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
House A
이사 할 것이라고 가정 House B
합니다. 곧 Bob은 자신의 주소 (위치)를 저장할 수 없습니다. Alice가 아직 그녀를 업데이트하지 않았거나 절대 업데이트하지 않았기 때문입니다.