C #의 위도 / 경도 값에 대한 이중 또는 소수


96

C #에서 지리적 위치 데이터를 저장할 때 사용하는 가장 좋은 데이터 유형은 무엇입니까? 정확성을 위해 십진수를 사용하지만 십진수 부동 소수점 숫자에 대한 연산은 이진 부동 소수점 숫자 (double)보다 느립니다.

대부분의 경우 위도 또는 경도에 대해 6 ~ 7 자리의 정밀도가 더 이상 필요하지 않다고 읽었습니다. 복식의 부정확성이 중요할까요 아니면 무시할 수 있나요?


6
나는 반대 질문을하고 싶습니다. 성능 차이가 중요합니까 아니면 무시할 수 있습니까?
Heinzi

1
데이터베이스에서 당신은 저장 경도와 위도에 "SQL 공간 데이터 유형"을 사용한다
azhar_SE_nextbridge

8
.NET BCL 자체는 GeoCoordinate 클래스 에서 double을 사용하는데 , 이는 정밀도가 충분할 수 있다는 강력한 표시입니다.
Heinzi

1
NodaTime의 TzdbZoneLocation도 double을 사용합니다.
Rick Davin 2015 년

4
1) 고정 소수점을 고려합니다. 자주 지리 좌표 삼각 작업을 할 필요가 있고, 그에만 구현되기 때문에 2) double, double가장 적합한 수 있습니다.
CodesInChaos

답변:


120

double몇 가지 이유가있다.

  • 삼각 함수는 double 형에만 사용할 수 있습니다.
  • 이중 정밀도 (100 나노 미터 범위)는 위도 / 경도 값에 필요한 모든 것을 훨씬 뛰어 넘습니다.
  • GeoCoordinate 클래스 및 타사 모듈 (예 : DotSpatial )도 좌표에 double을 사용합니다.

75

double은 최대 15 자리의 정밀도를 갖습니다. 따라서 위도 / 경도 값 (최대 180deg)에 대해이 숫자 중 세 자리가 소수점 왼쪽에 있다고 가정합니다. 오른쪽에 12 자리 정밀도가 남습니다. 위도 / 경도가 ~ 111km이므로이 12 자리 중 5 자리는 미터에 대한 정밀도를 제공합니다. 3 자리가 더 있으면 밀리미터 단위의 정밀도를 얻을 수 있습니다. 나머지 4 자리는 약 100 나노 미터의 정밀도를 얻을 수 있습니다. double은 성능과 기억력의 관점에서 이길 것이기 때문에 십진수 사용을 고려할 이유조차 없습니다.


2
상세하고 정확한 설명을 위해 하나를 추가하십시오.
Najeeb

4

나는 꽤 오래 전에 공간 프로그래밍을 시작할 때이 질문에 직면했습니다. 나는 이것으로 나를 이끌었던 책을 얼마 전에 읽었다.

//sql server has a really cool dll that deals with spacial data such like
//geography points and so on. 
//add this namespace
Using Microsoft.SqlServer.Types;

//SqlGeography.Point(dblLat, dblLon, srid)

var lat_lon_point = Microsoft.SqlServer.Types.SqlGeography.Point(lat, lon, 4326);

공간 데이터를 사용하여 응용 프로그램에서 작업 할 때 가장 좋은 방법입니다. 그런 다음 데이터를 저장하려면 SQL에서 이것을 사용하십시오.

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

그렇지 않으면 SQL이 아닌 다른 것을 사용하는 경우 포인트를 16 진수로 변환하고 저장하십시오. 나는 이것이 가장 안전하다는 것을 오랫동안 알고 있습니다.


LatLonPoint를 찾는 데 문제가 있습니다. 어떤 참조 또는 패키지를 포함해야했으며 C # 프로젝트에 어떤 '사용'을 포함해야하나요? (생성 테이블이 ID 모델 / C # 코드 용이라고 가정하면 해당 유형은 SSMS에서도 평가되지 않기 때문입니다). 미리 감사드립니다!
Chris

0

더블

답변을 결합하면 Microsoft가 SqlGeography 라이브러리에서 자신을 나타내는 방법입니다.

[get : Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] public System.Data.SqlTypes.SqlDouble Lat {get; } 속성 값 SqlDouble 위도를 지정하는 SqlDouble 값입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.