首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法绘制R中具有相同CRS的两个空间对象

无法绘制R中具有相同CRS的两个空间对象
EN

Stack Overflow用户
提问于 2017-05-09 03:04:53
回答 2查看 913关注 0票数 2

我有两个空间对象,一个是空间多边形对象,另一个是.csv文件,我将其转换为空间点对象。第一个是智利政府为其一个公社创建的官方形状文件,另一个是通过使用HERE API地理编码创建的,这里是同一公社的街道地址。

首先,我使用readOGR从加载了空间多边形对象:

代码语言:javascript
复制
quilpue <- readOGR( dsn= getwd() , layer="quilpue-rgdal", 
                encoding = "UTF-8") 

然后,我将.csv文件加载到R中,并使用sp包中的coordinates()函数将其转换为空间点对象。

代码语言:javascript
复制
pointsCoords<- read.csv("../quilpueR/quilpueLayer.csv", header = TRUE)
coordinates(pointsCoords) <- ~Longitude+Latitude

然后我检查了每个物体的投影。

代码语言:javascript
复制
proj4string(quilpue) 
proj4string(pointsCoords)

"+proj=utm +zone=19 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"NA

唯一适用于pointsCoords的投影是CRS("+init=epsg:3857")。因此,我将该投影分配给了quilpue

代码语言:javascript
复制
proj4string(pointsCoords) <- CRS("+init=epsg:3857")
quilpue_prj <- spTransform(quilpue, CRSobj = CRS(proj4string(pointsCoords)))

尽管如此,当我使用raster()包中的extent()检查这两个对象的扩展时,它们并不重叠。

代码语言:javascript
复制
extent(quilpue_prj)
class       : Extent 
xmin        : -7957703 
xmax        : -7946463 
ymin        : -3907594 
ymax        : -3898059 

extent(pointsCoords)
class       : Extent 
xmin        : -71498550 
xmax        : -71334950 
ymin        : -33133030 
ymax        : -32769810 

因此,当我尝试将它们绘制在一起时,它们不会重叠。我只得到我选择绘制的第一个对象的绘图。

代码语言:javascript
复制
plot(quilpue_prj)
plot(pointsCoords, add = TRUE) 

为了检查shapefile或.csv文件是否有问题,我在另一个地理信息系统软件Maptitude上打开了这两个文件,它会设法自动覆盖它们。我希望在R中也能做到这一点。

EN

回答 2

Stack Overflow用户

发布于 2017-05-09 05:16:27

我设法解决了这个问题,但我真的不明白它为什么会起作用。加载.csv文件并使用

代码语言:javascript
复制
coordinates(pointsCoords) <- ~Longitude+Latitude 

为了创建空间points对象,我使用了raster包中的projection()函数来为它分配一个投影:

代码语言:javascript
复制
projection(pointsCoords) = "+init=epsg:4326"

然后,我先将空间多边形对象quilpue的投影转换为"+init=epsg:3857",然后再转换为"+init=epsg:4326"

代码语言:javascript
复制
quilpue <- spTransform(quilpue, 
             CRSobj = CRS("+init=epsg:3857"))

quilpue <- spTransform(quilpue, 
                       CRSobj = CRS("+init=epsg:4326"))

使用bbox(),我检查每个空间对象的范围:

代码语言:javascript
复制
bbox(pointsCoords)

            min       max
Longitude -71498550 -71334950
Latitude  -33133030 -32769810

bbox(quilpue)

    min       max
x -71.48526 -71.38429
y -33.09254 -33.02075

请注意,它们非常相似,并且pointsCoords包含在quilpue中。唯一需要注意的是,quilpue coords在前两位数字后有一个".",所以我使用gsub"."添加到pointsCoords中的coords中。

代码语言:javascript
复制
dfcoords <- as.data.frame(pointsCoords@coords)
dfcoords$Longitude <- as.numeric(gsub("([[:digit:]]{6,6})$", ".\\1", 
                      dfcoords$Longitude)) 
dfcoords$Latitude <- as.numeric(gsub("([[:digit:]]{6,6})$", ".\\1", 
                      dfcoords$Latitude)) 
coordinates(dfcoords) <-  ~Longitude+Latitude

并将修改后的coords分配给原始And。

代码语言:javascript
复制
pointsCoords@coords <- dfcoords@coords

然后我就可以使用over()并绘制空间对象了。

代码语言:javascript
复制
df_over <- over(quilpue_prj, pointsCoords)
plot(quilpue)
plot(pointsCoords, add = TRUE)

票数 1
EN

Stack Overflow用户

发布于 2018-05-14 23:27:30

为了回答你的问题,我认为你已经经历了一些不必要的步骤。

为了将它们绘制在一起,它们只需要在相同的CRS中:

代码语言:javascript
复制
library(rgdal)    

quilpue <- spTransform(quilpue, CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")) #or any CRS you wish to use

pointsCoords <- spTransform(pointsCoords, CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"")) #or any CRS you wish to use

plot(quilpue)
plot(pointsCoords, add = T)

还有一件很有帮助的事情,就是检查你的特征的范围,以确保它们对齐。有时,有问题的功能会出现在相同的CRS中,但由于处理或许多转换,它们最终会以扭曲的范围结束。请使用以下命令进行检查:

代码语言:javascript
复制
extent(quilpue)
extent(pointsCoords)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43855406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档