在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
@亚伦,我是同一个人。我在那里没有得到适当的答案。你能帮我吗?我真的很惊讶你有多少挑剔。
Topdombili

1
@Top这不是挑剔,是StackExchange策略。交叉发布会产生各种不一致和问题。(您可能还注意到,在错误的论坛上发帖也可能会得到比有用的答案少的东西。)请删除您发帖的SO版本。
Whuber

@Topdombili,我只是想指出,根据胡伯的回答,输入值在WGS84上,并且正在进行基准转换以及对CH1903 + / LV95网格的投影。
mkennedy

@mkennedy谢谢您的观察。我没有解释我是否假设原始(纬度,经度)坐标为WGS 84(该假设埋在代码的注释中)而感到困惑。如果不是,请相应地更改其值proj4string(d)。我的注意力主要集中在虚假的Easting和Northing参数上,x0并且y0,因为Web上一些流行的引用(例如,代码中的第一个注释)已将其最有效的数字都删除了,从而使所有点都移了几千公里:-)。
whuber

1
@whuber,哎re:参考!我确实看到了您对WGS 84输入设置的评论,但想确保Topdombili看到了它。
mkennedy 2013年

Answers:


18

使用RGDAL包。使用哪个CRS存在一个问题。RGDAL无法识别EPSG代码。您必须显式提供参数,如下所示。(显然,这些是近似值,但应该是不错的。它们似乎在预期值的0.1 m之内。)

# 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,1] 2579333.69 1079729.18
[3,] 2579263.65 1079770.55
[4,] 2579928.04 1080028.46
[5,1] 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度,我的意思是两位十进制。
Topdombili

1
我不明白你的评论。您是否在以有限的精度指定原始(纬度,经度)值时投影坐标的精度如何?如果是这样,您可能会发现此答案很有用。
Whuber

1
rgdal确实承认EPSG:2056,FWIW
mdsumner

@md谢谢!我找到了一个引用,指出这是EPSG:9814,但是RGDAL无法识别它。
whuber
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.