在水体上移除部分光栅图像

时间:2016-04-29 12:28:51

标签: r leaflet gis raster

我试图制作一张leaflet的地图,该地图最终将用于显示在地理区域内插的各种估算值。

我为链接数据道歉。我并不聪明,无法弄清楚如何从Google文档导入.RData文件。我可以从https://drive.google.com/file/d/0Bw3leA1Ef_e5RmdKVDNYX0xmS2s/view?usp=sharing下载我正在使用的光栅形状 (这是与下面使用的Coordrnewcleveland对象的更新链接。

我能够获得我想要的地图:

library(tigris) 
library(leaflet)
library(raster)
library(magrittr)
library(dplyr)

load("Coord.Rdata")

rnew <- 
  rasterFromXYZ(
    Coord,
    crs = "+init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
  )

pal <- colorNumeric(c("#0C2C84", "#41B6C4", "#FFFFCC"), values(rnew),
                    na.color = "transparent")

leaflet() %>% addTiles() %>%
  addRasterImage(rnew, colors = pal, opacity = 0.4)

哪个产生 enter image description here

现在,尽管如此美丽,但在伊利湖上展示估计值对我来说并没有多大意义。我希望移除湖面上的光栅图像部分,或将其设置为透明......不会留下我计算海洋野生动物风险的印象。

我想如果我能找到俄亥俄州的纬度和经度,我或许可以只使用交叉点,从而去除湖上的点。我尝试使用

将它组合在一起
ohio <- tracts(state = "39")

ohio_raster <- 
  attributes(ohio)$data[, c("INTPTLON", "INTPTLAT")] %>%
  setNames(c("x", "y")) %>%
  mutate(x = sub("^[-]", "", x) %>%
           as.numeric(),
         y = sub("^[+]", "", x) %>%
           as.numeric(),
         layer = 1) %>%
  as.matrix() %>%
  rasterFromXYZ(crs = "+init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")

但得到了错误

  

rasterFromXYZ中的错误(。,crs =&#34; + init = epsg:4326 + proj = longlat   + datum = WGS84 + no_defs + ellps = WGS84 + towgs84 = 0,0,0&#34;):x单元格大小不规则

这种作品,但没有颜色,所以我看不到交叉点

ohio_raster <- 
  raster(ohio, crs = "+init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")

leaflet() %>% addTiles() %>%
  addRasterImage(rnew, colors = pal, opacity = 0.4) %>%
  addRasterImage(ohio_raster, colors = "red", opacity = .4)
  

警告讯息:   在raster :: projectRaster(x,raster :: projectExtent(x,crs = sp :: CRS(epsg3857)))中:
  &#39;从&#39;没有单元格值

(注意:地图缩小到包括整个俄亥俄州) enter image description here

我还认为如果我使用空间包,可能会计算出交叉点:

spdf <- 
  SpatialPointsDataFrame(Coord[, 1:2], 
                         Coord,
                         proj = CRS("+init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))

ohio_coord <- attributes(ohio)$data[, c("INTPTLON", "INTPTLAT")] %>%
  setNames(c("x", "y")) %>%
  mutate(x = sub("^[-]", "", x) %>%
           as.numeric(),
         y = sub("^[+]", "", x) %>%
           as.numeric(),
         layer = 1) %>%
  as.matrix() %>%
  as.data.frame()

spdf_ohio <- 
  SpatialPointsDataFrame(ohio_coord[, 1:2], 
                         ohio_coord,
                         proj = CRS("+init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))

spdf_merge <- merge(spdf, spdf_ohio)

leaflet() %>% addTiles() %>%
  addRasterImage(raster(spdf_merge), colors = pal, opacity = 0.4) 

但我得到

  

警告消息:在raster :: projectRaster(x,raster :: projectExtent(x,   crs = sp :: CRS(epsg3857))):&#39;来自&#39;没有单元格值

enter image description here

所以,实际问题:

  1. 这是解决这个问题的合理方法吗?我有没有更好的方法?
  2. 如何从纬度和经度转到带有值的光栅图像以显示阴影,以便我可以看到我正在使用的内容?
  3. 即使我没有直接回答手头的问题,我也会欣喜若狂地获得一些关于在哪里找到类似问题的指导。我还没有找到类似的东西,这可能是一个不知道正确搜索条件的标志。

    编辑:

    我觉得我可能更接近一步,但仍然不在那里。

    我根据@IvanSanchez的建议下载了克利夫兰的地理位置。只需绘制多边形即可。

    enter image description here

    这看起来像我想要保留的空间。这是一个很好的一步。

    现在我尝试通过

    与当前的栅格相交
    cleveland <- 
      readOGR(dsn = "cleveland_ohio.osm2pgsql-shapefiles",
              layer = "cleveland_ohio_osm_polygon",
              p4s = "+init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")
    
    leaflet() %>% addTiles() %>%
      addRasterImage(raster::intersect(rnew, cleveland), 
                     colors = pal, 
                     opacity = 0.4)
    

    但是,我似乎没有这些领域的交汇点。或者不同的东西。

    enter image description here

    我已将上述链接更新为包含Coordrnewcleveland个对象的文件。

2 个答案:

答案 0 :(得分:2)

您可以使用表示土地面积的shapefile屏蔽栅格。您可以使用您的Ohio tract shapefile,但Natural Earth的lakes data可能会简化事情。例如:

library(leaflet)
library(raster)
library(magrittr)
library(rgdal)
library(rgeos)

load('Coord.Rdata')  
rnew <- rasterFromXYZ(Coord, crs='+init=epsg:4326')
pal <- colorNumeric(c('#0C2C84', '#41B6C4', '#FFFFCC'), values(rnew),
                    na.color = 'transparent')

# Download and extract the Natural Earth data
download.file(
  file.path('http://www.naturalearthdata.com/http/',
            'www.naturalearthdata.com/download/10m/physical/ne_10m_lakes.zip',
            f <- tempfile())
unzip(f, exdir=tempdir())

# Read in the lakes shapefile    
lakes <- readOGR(tempdir(), 'ne_10m_lakes')

# Create a "land" shapefile by taking the difference between the 
# raster's extent and the lakes polys
land <- gDifference(as(extent(rnew), 'SpatialPolygons'), lakes)

# Mask rnew
rnew2 <- mask(rnew, land)

leaflet() %>% addTiles() %>%
  addRasterImage(rnew2, colors = pal, opacity = 0.4)

enter image description here

它并不完美地跟随海岸线,但它并不太糟糕。

答案 1 :(得分:0)

我建议您从MapZen metro extract for Cleveland下载该地区的地理数据。这将为您提供一些用于陆地区域和水域的漂亮多边形 - 然后您可以将您的形状与地面多边形相交(或从您的形状中减去水多边形)。