program tip

SQL Server에서 좌표 (Google지도의 경도 / 위도)를 저장하는 가장 좋은 방법은 무엇입니까?

radiobox 2020. 8. 19. 07:54
반응형

SQL Server에서 좌표 (Google지도의 경도 / 위도)를 저장하는 가장 좋은 방법은 무엇입니까?


사용자 목록과 Google지도 좌표 (경도 및 위도)를 저장할 테이블을 SQL Server 2008에서 디자인하고 있습니다.

두 개의 필드가 필요합니까, 아니면 1로 할 수 있습니까?

이러한 종류의 데이터를 저장하는 데 가장 적합한 (또는 가장 일반적인) 데이터 유형은 무엇입니까?


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 ;

나는 "여기에 새로운 유형이있다, 그것을 사용하자"라고 말하는 사람들과 반대되는 것이 싫다. 새로운 SQL Server 2008 공간 유형에는 몇 가지 장점, 즉 효율성이 있지만 항상 해당 유형을 사용한다고 맹목적으로 말할 수는 없습니다. 그것은 실제로 더 큰 그림 문제에 달려 있습니다.

예를 들어 통합입니다. 이 유형은 .Net에서 동등한 유형을 가지고 있지만 interop은 어떻습니까? .Net의 이전 버전을 지원하거나 확장하는 것은 어떻습니까? 이 유형을 서비스 계층 전체에서 다른 플랫폼에 노출하는 것은 어떻습니까? 데이터 정규화는 어떻습니까-아마도 당신은 위도 또는 경도 독립형 정보에 관심이있을 것입니다. long / lat을 처리하는 복잡한 비즈니스 로직을 이미 작성했을 것입니다.

공간 유형을 사용해서는 안된다는 것이 아닙니다. 많은 경우에 사용해야합니다. 그 길을 가기 전에 좀 더 중요한 질문을해야한다고 말하는 것입니다. 귀하의 질문에 가장 정확하게 대답하려면 귀하의 특정 상황에 대해 더 많이 알아야합니다.

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 Spatial 유형-> GEOGRAPHY로 저장하는 것입니다.

여기 제가 가지고있는 테이블의 스크린 샷이 있습니다.

대체 텍스트 http://img20.imageshack.us/img20/6839/zipcodetable.png

이 테이블에는 지리 데이터를 저장하는 두 개의 필드가 있습니다.

  • 경계 : 우편 번호 경계인 다각형입니다.
  • CentrePoint :이 다각형의 시각적 중간 지점을 나타내는 위도 / 경도 지점입니다.

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 스택 업데이트를 기반으로 한 최근 답변입니다.

Google Maps의 위도 및 경도는 지리 데이터 유형의 SQL 서버에 Point (note capital P) 데이터로 저장되어야합니다.

테이블에 저장된 현재 데이터를 가정 할 Sample열에서 VARCHAR로 latlon쿼리 아래 것은, 당신이 지리로 변환 도움이 될 것입니다

alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go

추신 : 다음 번에 결과 및 메시지 탭과는 별도로 지리 데이터로이 테이블을 선택하면 시각화를 위해 아래와 같은 공간 결과 탭도 표시됩니다.

SSMS geo results tab


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);
    }
}

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


URL로 대체하려는 경우 한 필드가 가능하다고 가정합니다. 따라서 다음과 같은 URL을 형성 할 수 있습니다.

http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6

but as it is two pieces of data I would store them in separate fields


Store both as float, and use unique key words on them.i.em

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);

참고URL : https://stackoverflow.com/questions/551894/whats-the-best-way-to-store-co-ordinates-longitude-latitude-from-google-maps

반응형