SQL Server에 코디네이트 (Google지도에서 경도/위도)를 저장하는 가장 좋은 방법은 무엇입니까?
-
23-08-2019 - |
문제
SQL Server 2008에서 사용자 목록과 Google지도 (Longitude & Latitude) 목록을 저장하는 테이블을 설계하고 있습니다.
두 개의 필드가 필요합니까, 아니면 1으로 수행 할 수 있습니까?
이러한 종류의 데이터를 저장하는 데 사용할 가장 좋은 (또는 가장 일반적인) 데이터 유형은 무엇입니까?
해결책
SQL Server 2008에 도입 된 새로운 공간 데이터 유형을 살펴보십시오. 이런 종류의 작업을 위해 설계되었으며 인덱싱 및 쿼리를 훨씬 쉽고 효율적으로 만듭니다.
추가 정보:
다른 팁
공정한 경고! 지리 유형을 사용하도록 조언을하기 전에 LINQ 또는 엔티티 프레임 워크를 사용하여 데이터가 지원되지 않기 때문에 (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 ;
나는 "여기에 새로운 유형이 있습니다. 사용합시다"고 말하는 사람들과 반대되는 것을 싫어합니다. 새로운 SQL Server 2008 공간 유형에는 일부 프로트, 즉 효율성이 있지만 항상 해당 유형을 사용한다고 말할 수는 없습니다. 그것은 실제로 더 큰 그림 문제에 달려 있습니다.
예를 들어, 통합. 이 유형은 .NET의 동일성 유형을 가지고 있지만 인터 로프는 어떻습니까? 이전 버전의 .NET을 지원하거나 확장하는 것은 어떻습니까? 서비스 계층을 통해이 유형을 다른 플랫폼에 노출시키는 것은 어떻습니까? 데이터의 정규화는 어떻습니까 - 아마도 독립형 정보로 위도에 관심이 있거나 오랫동안 관심이있을 수 있습니다. 아마도 당신은 이미 Long/Lat을 처리하기 위해 복잡한 비즈니스 논리를 작성했을 것입니다.
나는 당신이 공간 유형을 사용해서는 안된다고 말하는 것이 아닙니다. 많은 경우에해야합니다. 나는 그 길을 따라 가기 전에 더 중요한 질문을해야한다고 말하고 있습니다. 내가 당신의 질문에 가장 정확하게 대답하려면 당신의 특정 상황에 대해 더 알아야합니다.
길/위도를 별도로 또는 공간 유형에 저장하는 것은 모두 실행 가능한 솔루션이며, 하나는 자신의 상황에 따라 다른 하나보다 바람직 할 수 있습니다.
내가하는 방식 : 나는 보관한다 위도 그리고 경도 그런 다음 첫 번째 두 열의 자동 파생 지리 유형 인 세 번째 열이 있습니다. 테이블은 다음과 같습니다.
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 목적으로 표시되거나 추출하는 데 필요한 위도 및 경도 값을 검색 할 수도 있습니다.
당신이하고 싶은 것은 새로운 SQL2008 공간 유형 -> 지리로 위도와 경도를 저장하는 것입니다.
다음은 테이블의 스크린 샷입니다.
Alt Text http://img20.imageshack.us/img20/6839/zipcodetable.png
이 표에는 지리 데이터를 저장하는 두 개의 필드가 있습니다.
- 경계 : 이것은 우편 번호 경계 인 다각형입니다.
- Centrepoint : 이것은이 다각형의 시각적 중간 점을 나타내는 위도 / 경도 지점입니다.
지리적 유형으로 데이터베이스에 저장하려는 주된 이유는 모든 공간 메소드를 활용할 수 있기 때문입니다. 폴리 포인트, 두 지점 사이의 거리 등
BTW, 우리는 또한 Google의지도 API를 사용하여 LAT/Long 데이터를 검색하고 SQL 2008 DB에 저장 하므로이 방법이 작동합니다.
SQL Server는 공간 관련 정보를 지원합니다. 당신은 더 많은 것을 볼 수 있습니다 http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx.
또는 정보를 두 개의 기본 필드로 저장할 수 있습니다. 일반적으로 플로트는 대부분의 장치에서보고 한 표준 데이터 유형이며 1 인치 또는 2 인치 이내에 충분히 정확합니다. Google지도에 적합합니다.
노트: 이것은 최근 SQL Server, .NET 스택 업데이트를 기반으로 한 최근 답변입니다.
Google지도의 Latitite 및 Longitude는 지리 데이터 유형에 따라 SQL Server의 포인트 (주 Capital P) 데이터로 저장되어야합니다.
현재 데이터가 테이블에 저장되었다고 가정합니다 Sample
컬럼 아래 바르 르 차로 lat
그리고 lon
, 아래 쿼리는 지리로 변환하는 데 도움이됩니다
alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go
추신: 다음에 결과 및 메시지 탭을 제외하고 지리 데이터 로이 테이블에서 선택을 할 때 시각화를 위해 아래와 같은 공간 결과 탭도 얻게됩니다.
엔티티 프레임 워크 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
was the 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
그러나 두 개의 데이터이므로 별도의 필드에 저장합니다.
둘 다 플로트로 저장하고 그들에게 고유 한 키워드를 사용하십시오.
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);