将纬度/经度转换为州平面坐标

9
我有一组包含纬度和经度的数据集,我想将其转换为伊利诺伊州东部的州平面坐标,使用EPSG 2790 (http://spatialreference.org/ref/epsg/2790/)或者ESRI 102672 (http://spatialreference.org/ref/esri/102672/)。

这个问题之前肯定已经被问过了,我的代码基于这里的答案 ("Non Finite Transformation Detected" in spTransform in rgdal R Packagehttp://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个回答

5

这里有一些更多的可行代码,可以澄清正在进行的操作:

# 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")])
}

谢谢,这是我找到的第一个有用的回复。 - jzadra

1
当您设置数据的coordinates时,必须先设置纬度,然后再设置经度。
换句话说,将以下内容更改为: 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 

1
对于通过谷歌搜索伊利诺伊州找到此代码的任何人,请不要感到困惑——尽管经度和纬度被交换了(即41.20是伊利诺伊州的纬度,而不是经度!),但这段代码实际上是有效的。 - stackoverflax

0

在rgdal中,esri代码(102649)对我无效,我不得不手动从proj4js页面编写代码,以从州平面(0202亚利桑那州中央)转换为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)

0

我在进行反向转换时遇到了问题,并在GIS Stack Exchange上找到了这个回答,可能对未来的寻求者有所帮助。根据您的坐标系统是NAD83还是NAD83(HARN),空间参考epsg代码将有所不同。如果使用错误的系统,则可能无法将点转换为超出任何坐标平面限制的值。

https://gis.stackexchange.com/questions/64654/choosing-the-correct-value-for-proj4string-for-shape-file-reading-in-r-maptools

读取纬度和经度与读取经度和纬度确实会对输出产生影响-在我的情况下(从州平面到WGS84),我不得不编写

coordinates(data) <- ~ long+lat

您可以通过绘制已知的参考点来确认是否正确转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接