Convertendo sistema de coordenadas geográficas em R

14

Eu tenho pontos no sistema de coordenadas geográficas e queria convertê-los em grade suíça (CH1903 +).

Dados de amostra:

 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

Resultados respeitados:

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 
Topdombili
fonte
3
@ Aaron, eu sou o mesmo cara. Não tenho resposta adequada lá. Você pode me ajudar? Estou realmente impressionado com o quanto você é exigente.
Topdombili
1
@Top Isso não é exigente, é a política do StackExchange. A postagem cruzada cria todos os tipos de inconsistências e problemas. (Você também deve ter notado que postar no fórum errado também pode ter respostas menos que úteis.) Exclua a versão do SO que você postou.
whuber
@ Topdombili, eu só queria salientar que, de acordo com a resposta do whuber, os valores de entrada estão no WGS84 e estão passando por uma transformação de dados mais uma projeção para a grade CH1903 + / LV95.
mkennedy
@mkennedy Obrigado por essa observação. Fui negligente ao não explicar que assumi que as coordenadas originais (lat, lon) são WGS 84 (essa suposição está oculta em um comentário no código). Caso contrário, altere o valor de proj4string(d)acordo. Minha atenção foi principalmente direcionada aos parâmetros falsos de leste e norte x0e y0, porque algumas referências populares na Web (como no primeiro comentário no código) diminuíram seus dígitos mais significativos, deslocando todos os pontos em alguns milhares de quilômetros :-).
whuber
1
@ whuber, ai re: as referências! Eu vi seu comentário sobre a entrada definida como WGS 84, mas queria garantir que Topdombili a visse.
mkennedy

Respostas:

18

Use o pacote RGDAL . Há uma questão de qual CRS usar; O RGDAL não reconhece o código EPSG. Você deve fornecer os parâmetros explicitamente, como mostrado aqui. (Aparentemente, essas são aproximações, mas deveriam ser muito boas. Elas parecem estar a cerca de 0,1 m dos valores pretendidos.)

# 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)

Parcelas

        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

whuber
fonte
Eu queria perguntar se o resultado da conversão poderia ser menor, enquanto não há valores decimais, enquanto as coordenadas disponíveis nos resultados respeitados estão no nível mais próximo de 10 graus, eu quis dizer 2 dígitos decimais.
Topdombili
1
Eu não entendo o seu comentário. Você está perguntando sobre a precisão das coordenadas projetadas quando os valores originais (lat, lon) são especificados com precisão limitada? Nesse caso, você pode achar útil essa resposta .
whuber
1
rgdal reconhece EPSG: 2056, FWIW
mdsumner
@md Obrigado! Eu havia encontrado uma referência que afirma que é EPSG: 9814, mas a RGDAL não a reconheceu.
whuber