为proj4string选择正确的值以在R中读取shapefile?


14

我有一个多边形的shapefile和另一个CSV文件,其中包含(Lat,Lng)对点列表。

我想检查CSV文件中每个(纬度,经度)对属于哪个多边形。

shapefile被投影,proj文件的内容如下:

PROJCS["Transverse_Mercator",GEOGCS["GCS_OSGB 1936",
DATUM["D_OSGB_1936",SPHEROID["Airy_1830",6377563.396,299.3249646]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",-2],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000],PARAMETER["false_northing",-100000],UNIT["Meter",1]]

我的计划如下:

  1. 使用readShapePolyR MapTools包中的函数读取shapefile 。
  2. 将点坐标从CSV文件读取到数据框中,然后将其转换为SpatialPointsDataFrame
  3. 使用over函数确定其落入哪个多边形。

为此,我需要proj4string在第1步中加载shapefile 的同时指定时间,并在使用第3步中的spTransform功能之前,先使用函数将CSV文件中的坐标转换为相同的投影系统over,因为它要求点和多边形必须在同一投影系统下。

是否知道上面显示的proj文件内容的正确值是什么?


如果您的shapefile已经定义了投影,请在rgdal软件包中使用“ readOGR”。该软件包是GDAL的包装,实际上取代了maptools中shapefile的读/写功能。此功能处理所有拓扑类型并保留投影信息。
Jeffrey Evans

当我尝试使用readOGR功能加载形状文件时,总是出现无法打开文件错误
Moustafa Alzantot 2013年

好的,现在我已经可以使用readOGR读取文件了。使用对象的summary函数为SpatialPolygonDataFrame我提供了正确的值proj4string
Moustafa Alzantot 2013年

好吧,如果没有有关如何使用该功能的详细信息,将很难为您提供帮助!语法的一部分是数据所在的目录,并且文件名中不需要.shp扩展名。如果将工作目录设置为与shepfile相同的位置,则类似readOGR(getwd(),“ YourShape”)之类的东西应该可以工作。
Jeffrey Evans 2013年

感谢@JeffreyEvans,它现在可以工作了,我用它来获得proj4string
Moustafa Alzantot 2013年

Answers:


14

proj4string是有效的PROJ4 crs字符串。

请参阅如何从shapefile .prj文件获取proj4字符串或EPSG代码?Shapefile PRJ到PostGIS SRID查找表?

简而言之:

  • 您可以在第一个参考中使用gdalinfo或在第二个参考中使用GDAL Python绑定。

要么

  • 转到Prj2EPSG(将.prj文件中的知名文本投影信息转换为标准EPSG代码的简单服务)
  • 输入您的prj文件的内容

在此处输入图片说明

  • 结果是EPSG:27700,所以PROJ4字符串的第一个版本是

    + init = epsg:27700

`或

在此处输入图片说明

  • 单击Proj4,完整的PROJ4字符串为:

    + proj = tmerc + lat_0 = 49 + lon_0 = -2 + k = 0.9996012717 + x_0 = 400000 + y_0 = -100000 + ellps = airy + datum = OSGB36 + units = m + no_defs


10

这是一个非常方便的网站,用于检索给定投影的EPSG代码。您的情况是“ EPSG:27700”。如果为shapefile定义了投影,则可以在创建SpatialPointsDataFrame时分配投影,然后使用导入的shapefile中的投影定义。使用rgdal软件包中的“ readOGR”将保留投影定义。这是在sp类数据上分配和拉出坐标字符串的示例。

require(sp)
require(rgdal)

# Use meuse dataset
data(meuse)

# Coerce into SpatialPointsDataframe
coordinates(meuse) <- ~x+y

# Assign projection
proj4string(meuse) <- CRS("+init=epsg:28992")

# Pull some observations and transform to Lat/Long
meuse.geo <- meuse[sample(dim(meuse)[1],10),]
  prj.LatLong <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")
    meuse.geo <- spTransform(meuse.geo, prj.LatLong)

# Pull projection string from meuse.geo and use in spTransform
#   to reproject meuse to lat/long  
( prj <- proj4string(meuse.geo) )   
meuse <- spTransform(meuse, CRS(prj))   
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.