Преобразования широты/долготы в плоские координаты
у меня есть набор данных с координатами широты и долготы, которые я хотел бы преобразовать в государственной плоскости координаты Иллинойс Востоке, используя код EPSG: 2790 (http://spatialreference.org/ref/epsg/2790/) или, возможно, компания Esri 102672 (http://spatialreference.org/ref/esri/102672/).
это определенно было задано раньше; мой код основан на ответах здесь ( "обнаружено не конечное преобразование" в spTransform в пакете rgdal R и http://r-sig-geo.2731867.n2.nabble.com/Converting-State-Plane-Coordinates-td5457204.html).
но по какой-то причине я не могу заставить его работать:
library(rgdal)
library(sp)
data = data.frame(long=c(41.20,40.05), lat=c(-86.14,-88.15))
coordinates(data) <- ~ long + lat
proj4string(data) <- CRS("+init=epsg:4326") # latitude/longitude
data.proj <- spTransform(data, CRS("+init=epsg:2790")) # illinois east
выдает:
non finite transformation detected:
long lat
41.20 -86.14 Inf Inf
Error in spTransform(data, CRS("+init=epsg:2790")) : failure in points 1
In addition: Warning message:
In spTransform(data, CRS("+init=epsg:2790")) :
2 projected point(s) not finite
4 ответов
при установке coordinates
для ваших данных, вы должны установить широты до долготы.
другими словами, изменить:
coordinates(data) <- ~ long + lat
to
coordinates(data) <- ~ lat+long
и это должно сработать.
library(rgdal)
library(sp)
data = data.frame(long=c(41.20,40.05), lat=c(-86.14,-88.15))
coordinates(data) <- ~ lat+long
proj4string(data) <- CRS("+init=epsg:4326")
data.proj <- spTransform(data, CRS("+init=epsg:2790"))
data.proj
дал мне этот выход:
SpatialPoints:
lat long
[1,] 483979.0 505572.6
[2,] 315643.7 375568.0
Coordinate Reference System (CRS) arguments: +init=epsg:2790 +proj=tmerc
+lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000
+y_0=0 +ellps=GRS80 +units=m +no_defs
вот еще один рабочий код, который разъясняет, что происходит:
# convert a state-plane coordinate to lat/long
data = data.frame(x=400000,y=0)
coordinates(data) <- ~ x+y
proj4string(data) <- CRS("+init=epsg:2804")
latlong = data.frame(spTransform(data, CRS("+init=epsg:4326")))
setnames(latlong,c("long","lat"))
latlong
выдает:
long lat
1 -77 37.66667
и:
# convert a lat/long to state-plane
data = latlong
coordinates(data) <- ~ long+lat
proj4string(data) <- CRS("+init=epsg:4326")
xy = data.frame(spTransform(data, CRS("+init=epsg:2804")))
setnames(xy,c("y","x"))
xy
выдает:
> xy
y x
1 4e+05 -2.690839e-08
и вот функция:
# this is for Maryland
lat_long_to_xy = function(lat,long) {
library(rgdal)
library(sp)
data = data.frame(long=long, lat=lat)
coordinates(data) <- ~ long+lat
proj4string(data) <- CRS("+init=epsg:4326")
xy = data.frame(spTransform(data, CRS("+init=epsg:2804")))
setnames(xy,c("y","x"))
return(xy[,c("x","y")])
}
У меня была проблема с преобразованием в другом направлении и нашел этот ответ на GIS Stack Exchange, который может быть полезен будущим искателям. В зависимости от того, является ли ваша система координат NAD83 или NAD83 (HARN), код пространственной привязки epsg будет отличаться. Если вы используете неправильную систему, она не сможет преобразовать точку в значения за пределами любой координатной плоскости.
чтение в lat+long против long+lat делает разницу в выходе - в моем случае (переход от плоскости состояния к WGS84) я должен был написать
coordinates(data) <- ~ long+lat
вы можете подтвердить это, построив известную опорную точку, чтобы определить, правильно ли она преобразована.
код esri (102649) в rgdal не работал для меня, мне пришлось вручную закодировать его со страницы proj4js, чтобы перейти от государственной плоскости (0202 Arizona Central) к WGS84:
d<- data.frame(lon=XCord, lat=YCord)
coordinates(d) <- c("lon", "lat")
proj4string(d) <- CRS("+proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs")
CRS.new <- CRS("+init=epsg:4326") # WGS 84
d.ch102649 <- spTransform(d, CRS.new)