R에서 지리 좌표계 변환


14

지리 좌표계에 점이 있고이를 스위스 그리드 (CH1903 +)로 변환하려고했습니다.

샘플 데이터 :

 id       lon      lat
  2 7.173500 45.86880
  3 7.172540 45.86887
  4 7.171636 45.86924
  5 7.180180 45.87158
  6 7.178070 45.87014
  7 7.177229 45.86923  
  8 7.175240 45.86808
  9 7.181409 45.87177
  10 7.179299 45.87020

존경받는 결과 :

id       E              N      
2     2579408.2431  1079721.1499
3     2579333.7158  1079729.1852
4     2579263.6502  1079770.1125
5     2579928.0358  1080028.4605
6     2579763.6471  1079868.9218
7     2579698.0756  1079767.9762
8     2579543.1019  1079640.6512
9     2580023.6226  1080049.2672
10    2579859.1889  1079875.2740 

3
@Aaron, 나는 같은 사람입니다. 나는 거기에 적절한 대답을 얻지 못했습니다. 도와 줄 수 있니? 당신이 얼마나 까다로운 지 정말 놀랍습니다.
Topdombili

1
@Top 이것은 까다 롭지 않으며 StackExchange 정책입니다. 교차 게시는 모든 종류의 불일치와 문제를 만듭니다. (잘못된 포럼에 게시해도 유용한 답변보다 약간 적은 답변을 얻을 수도 있습니다.) 게시 한 SO 버전을 삭제하십시오.
whuber

@ Topdombili, 나는 whuber의 대답에 따르면 입력 값이 WGS84에 있고 데이텀 변환과 CH1903 + / LV95 그리드에 대한 투영을 겪고 있음을 지적하고 싶었습니다.
mkennedy

@mkennedy 감사합니다. 원래 (위도, 경도) 좌표가 WGS 84 라고 가정했다고 설명하지 않았습니다 . 그렇지 않은 경우 proj4string(d)그에 따라 값을 변경하십시오 . 내 관심은 주로 거짓 Y 좌표와 X 좌표 매개 변수에 그려진 된 x0y0(예 : 코드의 첫 번째 주석에서와 같이) 웹에서 일부 인기 참조하여 몇 천 킬로미터의 모든 포인트를 생기죠, 가장 유효 숫자가 감소했기 때문에, :-).
whuber

1
@ whuber, ouch re : 참조! WGS 84로 설정된 입력에 대한 귀하의 의견을 보았지만 Topdombili가 그것을 보도록하고 싶었습니다.
mkennedy

답변:


18

RGDAL 패키지를 사용하십시오 . 사용할 CRS 문제가 있습니다. RGDAL은 EPSG 코드를 인식하지 못합니다. 여기에 표시된대로 매개 변수를 명시 적으로 제공해야합니다. (이것은 근사치 이지만 , 꽤 양호해야합니다. 의도 된 값의 약 0.1m 내에있는 것 같습니다.)

# References:
# http://lists.maptools.org/pipermail/proj/2001-September/000248.html (has typos)
# http://www.remotesensing.org/geotiff/proj_list/swiss_oblique_cylindrical.html
#
# Input coordinates.
#
x <- c(7.173500, 7.172540, 7.171636, 7.180180, 7.178070, 7.177229, 7.175240, 7.181409, 7.179299)
y <- c(45.86880, 45.86887, 45.86924, 45.87158, 45.87014, 45.86923, 45.86808, 45.87177, 45.87020)
#
# Define the coordinate systems.
#
library(rgdal)
d <- data.frame(lon=x, lat=y)
coordinates(d) <- c("lon", "lat")
proj4string(d) <- CRS("+init=epsg:4326") # WGS 84
CRS.new <- CRS("+proj=somerc +lat_0=46.9524056 +lon_0=7.43958333 +ellps=bessel +x_0=2600000 +y_0=1200000 +towgs84=674.374,15.056,405.346 +units=m +k_0=1 +no_defs")
# (@mdsumner points out that
#    CRS.new <- CRS("+init=epsg:2056")
# will work, and indeed it does. See http://spatialreference.org/ref/epsg/2056/proj4/.)
d.ch1903 <- spTransform(d, CRS.new)
#
# Plot the results.
#
par(mfrow=c(1,3))
plot.default(x,y, main="Raw data", cex.axis=.95)
plot(d, axes=TRUE, main="Original lat-lon", cex.axis=.95)
plot(d.ch1903, axes=TRUE, main="Projected", cex.axis=.95)
unclass(d.ch1903)

줄거리

        lon        lat  

[1] 2579408.24 1079721.15
[2] 2579333.69 1079729.18
[3] 2579263.65 1079770.55
[4] 2579928.04 1080028.46
[5] 2579763.65 1079868.92
[6] 2579698.00 1079767.97
[7] 2579543.10 1079640.65
[8] 2580023.55 1080049.26
[9 ,] 2579859.11 1079875.27


나는 10 진수 값이없는 동안 변환 정확도의 결과가 더 낮을 지 묻고 싶었지만 존경받는 결과에서 사용 가능한 좌표는 10도에 가까웠습니다. 십진수 2 자리를 의미했습니다.
Topdombili

1
귀하의 의견을 이해하지 못합니다. 원래 (lat, lon) 값이 제한된 정밀도로 지정된 경우 투영 된 좌표가 얼마나 정확한지 묻고 있습니까? 그렇다면 이 답변 이 도움 될 수 있습니다.
whuber

1
rgdal은 EPSG : 2056, FWIW를 인식합니다
mdsumner

@md 감사합니다! EPSG : 9814 라는 참조 를 찾았 지만 RGDAL은이를 인식하지 못했습니다.
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.