SQL Server에 코디네이트 (Google지도에서 경도/위도)를 저장하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/551894

문제

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

추신: 다음에 결과 및 메시지 탭을 제외하고 지리 데이터 로이 테이블에서 선택을 할 때 시각화를 위해 아래와 같은 공간 결과 탭도 얻게됩니다.

SSMS geo results tab

엔티티 프레임 워크 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);
    }
}

https://stackoverflow.com/a/25563269/3850405

당신이 그것을 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)
);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top