SQL Server에 좌표(Google 지도의 경도/위도)를 저장하는 가장 좋은 방법은 무엇입니까?
SQL Server 2008에서 사용자 목록과 구글 지도 좌표(경도와 위도)를 저장하는 테이블을 설계하고 있습니다.
두 개의 필드가 필요합니까, 아니면 한 개의 필드로 할 수 있습니까?
이러한 종류의 데이터를 저장하는 데 가장 적합한(또는 가장 일반적인) 데이터 유형은 무엇입니까?
공정한 경고!GIGREATION 유형을 사용하기 전에 Linkq 또는 Entity Framework를 사용하여 데이터에 액세스할 계획이 없음을 확인하십시오(2010년 11월 현재). 이 데이터는 지원되지 않으며 매우 슬프기 때문입니다.
2017년 7월 갱신
지금 이 답변을 읽고 계신 분들은 오래된 테크놀로지 스택을 언급하고 있기 때문에 더 이상 사용하지 않습니다.상세한 것에 대하여는, 코멘트를 참조해 주세요.
SQL Server 2008에서 도입된 새로운 Spatial Data-type을 살펴보겠습니다.이러한 종류의 작업을 위해 설계되었으며 인덱싱과 쿼리를 훨씬 쉽고 효율적으로 수행할 수 있습니다.
상세 정보:
MS TechNet: SQL Server 2008 공간 데이터 유형,
SQL Server에 대한 답은 모르지만...
MySQL에서 다음 이름으로 저장
이것은 Google 개발자 설명서의 공식 권장 사항입니다.
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
방법: 위도와 경도를 저장하고 세 번째 열이 있습니다. 세 번째 열은 첫 번째 두 열의 자동 파생 지리 유형입니다.표는 다음과 같습니다.
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를 위해 표시 또는 추출하는 데 필요한 위도 및 경도 값도 검색할 수 있습니다.
나는 "여기 새로운 타입이 있으니 쓰자"고 말하는 사람들에게 반대되는 사람이 되는 것이 싫다.새로운 SQL Server 2008 공간 유형에는 효율성이라는 장점이 있지만 항상 그 유형을 사용한다고 맹목적으로 말할 수는 없습니다.그건 정말 더 큰 그림의 문제에 달려있어요.
예를 들어 통합입니다.이 타입은 에 등비유형이 있습니다.Net - 하지만 interop은 어떻습니까?.Net의 이전 버전을 지원하거나 확장하는 것은 어떻습니까?이 유형을 서비스 계층 전체에 걸쳐 다른 플랫폼에 노출하는 것은 어떻습니까?데이터의 정규화는 어떨까요?아마도 최신 또는 독립형 정보에 관심이 있을 것입니다.긴 시간/짧은 시간에 대응할 수 있는 복잡한 비즈니스 로직은 이미 작성되어 있을 것입니다.
공간 유형을 사용하지 말라는 것이 아닙니다. 많은 경우 사용해야 합니다.그 길을 가기 전에 몇 가지 더 중요한 질문을 해야 한다는 거야.제가 당신의 질문에 가장 정확하게 답하기 위해서는 당신의 구체적인 상황에 대해 좀 더 알아야 할 것 같습니다.
long/lat을 개별적으로 저장하거나 공간 유형으로 저장하는 것은 둘 다 실행 가능한 해결책이며, 상황에 따라 다른 솔루션보다 하나를 선택하는 것이 더 나을 수 있습니다.
Latitude 및 Litude를 새로운 SQL2008 Space type -> GIGRIGE로 저장합니다.
여기 테이블 스크린샷이 있는데, 제가 가지고 있습니다.
alt 텍스트 http://img20.imageshack.us/img20/6839/zipcodetable.png
이 표에는 지리 데이터를 저장하는 두 개의 필드가 있습니다.
- 경계: 우편 번호 경계인 폴리곤입니다.
- CentrePoint: 이 폴리곤의 시각적 중앙점을 나타내는 위도/경도 지점입니다.
데이터베이스에 GIGREATION 유형으로 저장하는 주된 이유는 모든 SPACAL 메서드를 활용할 수 있기 때문입니다(예: > ) 。폴리 점, 두 점 사이의 거리 등
덧붙여서, Google의 지도 API를 사용하여 위도/긴 데이터를 가져와 SQL 2008 DB에 저장합니다.이 방법은 유효합니다.
SQL Server는 공간 관련 정보를 지원합니다.자세한 것은, http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx 를 참조해 주세요.
또는 정보를 두 개의 기본 필드로 저장할 수 있습니다. 보통 플로트는 대부분의 장치에서 보고하는 표준 데이터 유형이며 Google 지도에 적합한 1~2인치 이내의 정확성을 갖습니다.
메모: 이것은 최근 SQL Server 에 기반한 최신 답변입니다.NET 스택 업데이트
Google Maps의 위도와 경도는 SQL Server의 지리 데이터 유형에서 포인트(대문자 P) 데이터로 저장해야 합니다.
되어 있다고 합니다.Sample columns char ascharchar 。lat ★★★★★★★★★★★★★★★★★」lon
alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go
PS: 다음 표에서 지리 데이터를 선택할 때 [Results]탭과 [Messages]탭 외에 아래와 같은 [Spatial results]탭이 표시됩니다.
엔티티 프레임워크5 를 사용하고 있는 경우는,DbGeographyMSDN의 예:
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로 치환하는 경우는, 1개의 필드가 적당하다고 생각합니다.따라서 다음과 같은 URL을 형성할 수 있습니다.
http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6
그러나 두 개의 데이터이기 때문에 나는 그것들을 다른 필드에 저장할 것이다.
둘 다 플로트로 저장하고 고유한 키워드를 사용합니다.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
'programing' 카테고리의 다른 글
| CS1617: /langversion 옵션 '6'이 잘못되었습니다.ISO-1, ISO-2, 3, 4, 5 또는 기본값이어야 합니다. (0) | 2023.04.24 |
|---|---|
| 최신 Azure SDK를 사용하여 Blob 상에서 공유 액세스시그니처를 취득하는 방법NET API v12? (0) | 2023.04.24 |
| Eclipse 및 Windows의 새로운 라인 (0) | 2023.04.24 |
| Git 상태를 완료하는 데 시간이 오래 걸린다 (0) | 2023.04.24 |
| Bash 명령줄 인수를 해석하려면 어떻게 해야 하나요? (0) | 2023.04.24 |
