Conversione del sistema di coordinate geografiche in R


14

Ho punti nel sistema di coordinate geografiche e volevo convertirli in rete svizzera (CH1903 +).

Dati di esempio:

 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

Risultati rispettati:

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, sono lo stesso ragazzo. Non ho ricevuto una risposta adeguata lì. Puoi aiutarmi? Sono davvero sorpreso di quanto tu sia esigente.
Topdombili,

1
@Top Questo non è un problema, è una politica di StackExchange. Il cross-posting crea tutti i tipi di incoerenze e problemi. (Potresti anche aver notato che pubblicare un post nel forum sbagliato può anche ottenere alcune risposte meno che utili.) Elimina la versione SO che hai pubblicato.
whuber

@Topdombili, volevo solo sottolineare che secondo la risposta di whuber, i valori di input sono su WGS84 e stanno subendo una trasformazione di riferimento più una proiezione sulla griglia CH1903 + / LV95.
mkennedy,

@mkennedy Grazie per quell'osservazione. Non mi sono reso conto di non aver ipotizzato che le coordinate originali (lat, lon) siano WGS 84 (tale presupposto è sepolto in un commento nel codice). In caso contrario, modificare il valore di proj4string(d)conseguenza. La mia attenzione è stata principalmente attirata dai falsi parametri di est e nord x0e y0, poiché alcuni riferimenti popolari sul Web (come nel primo commento nel codice) hanno lasciato cadere le loro cifre più significative, spostando così tutti i punti di alcune migliaia di chilometri :-).
whuber

1
@whuber, ouch re: i riferimenti! Ho visto il tuo commento sull'input impostato su WGS 84, ma volevo assicurarmi che Topdombili lo vedesse.
mkennedy,

Risposte:


18

Usa il pacchetto RGDAL . C'è un problema di quale CRS usare; RGDAL non riconosce il codice EPSG. Devi fornire i parametri esplicitamente, come mostrato qui. (Apparentemente si tratta di approssimazioni, ma dovrebbero essere piuttosto buone. Sembrano essere a circa 0,1 m dai valori previsti.)

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

Terreni

        lon        lat  

[1,] 2.579.408,24 1.079.721,15
[2] 2.579.333,69 1.079.729,18
[3] 2.579.263,65 1.079.770,55
[4] 2.579.928,04 1.080.028,46
[5,] 2.579.763,65 1.079.868,92
[6,] 2.579.698,00 1.079.767,97
[7] 2.579.543,10 1.079.640,65
[8] 2.580.023,55 1.080.049,26
[9 ,] 2579859.11 1079875.27


Volevo chiedere che il risultato dell'accuratezza della conversione potesse essere inferiore mentre non ci sono valori decimali mentre le coordinate disponibili nei risultati rispettati sono al più vicino di 10 gradi, intendevo 2 cifre decimali.
Topdombili,

1
Non capisco il tuo commento. Stai chiedendo quanto siano precise le coordinate proiettate quando i valori originali (lat, lon) sono specificati con precisione limitata? In tal caso, potresti trovare utile questa risposta .
whuber

1
rgdal riconosce EPSG: 2056, FWIW
mdsumner

@md Grazie! Avevo trovato un riferimento che afferma che questo è EPSG: 9814, ma RGDAL non lo ha riconosciuto.
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.