R:创建加拿大某些省份和美国各州的地图

时间:2012-05-26 03:45:38

标签: r gis

我正在尝试创建一个选定的加拿大省/地区和选定的美国州的地图。到目前为止,最好的地图似乎是使用GADM数据生成的地图:http://www.gadm.org/

但是,我无法在同一地图上绘制美国和加拿大的地图,也无法在选定的省/地区和州绘制地图。例如,我对阿拉斯加,育空,西北地区,不列颠哥伦比亚省,阿尔伯塔省和蒙大拿州等感兴趣。

此外,美国地图似乎沿国际日期分开。

有人可以帮助我:

  1. 在一张地图上绘制上述省/地区和州:
  2. 避免美国在国际日期线上分开
  3. 覆盖纬度 - 经度网格
  4. 选择一个特定的投影,也许是一个多边形。
  5. 也许spplot不允许用户指定投影。我没有看到在spplot帮助页面上选择投影的选项。我知道如何使用地图包中的地图功能选择投影,但这些地图看起来并不那么漂亮,我也无法使用该功能绘制所需的省/地区和州的子集。

    我不知道如何开始添加纬度 - 经度网格。但是,'sp.pdf'文件的第3.2节似乎解决了这个问题。

    以下是我到目前为止提出的代码。我已经加载了我偶然发现的每个与地图相关的包,并注释了除省/地区或州界限之外的GADM数据。

    不幸的是,到目前为止,我只设法绘制了加拿大或美国的地图。

    library(maps)
    library(mapproj)
    library(mapdata)
    library(rgeos)
    library(maptools)
    library(sp)
    library(raster)
    library(rgdal)
    
    # can0<-getData('GADM', country="CAN", level=0) # Canada
      can1<-getData('GADM', country="CAN", level=1) # provinces
    # can2<-getData('GADM', country="CAN", level=2) # counties
    
    plot(can1)    
    spplot(can1, "NAME_1") # colors the provinces and provides
                           # a color-coded legend for them
    can1$NAME_1            # returns names of provinces/territories
    # us0 <- getData('GADM', country="USA", level=0)
      us1 <- getData('GADM', country="USA", level=1)
    # us2 <- getData('GADM', country="USA", level=2)
    plot(us1)              # state boundaries split at 
                           # the dateline
    us1$NAME_1             # returns names of the states + DC
    spplot(us1, "ID_1")
    spplot(us1, "NAME_1")  # color codes states and
                           # provides their names
    #
    # Here attempting unsuccessfully to combine U.S. and Canada on one map.
    # Attempts at selecting given states or provinces have been unsuccessful.
    #
    plot(us1,can1)
    us.can1 <- rbind(us1,can1)
    

    感谢您的帮助。到目前为止,我在上面的步骤2 - 4中没有取得任何进展。也许我要求的太多了。也许我应该简单地切换到ArcGIS并尝试该软件。

    我已阅读此StackOverflow帖子:

    Can R be used for GIS?

    修改

    我现在借用了'应用空间数据分析与R'Bevand等人的电子版。 (2008年)并从该书的网站下载(或找到)相关的R代码和数据:

    http://www.asdar-book.org/

    我还在这里找到了一些漂亮的与GIS相关的R代码:

    https://sites.google.com/site/rodriguezsanchezf/news/usingrasagis

    如果我学习如何实现预期目标,我将在此处发布解决方案。虽然如果我无法实现R中的目标,我最终可能会转移到ArcGIS。

2 个答案:

答案 0 :(得分:8)

要在同一设备上绘制多个SpatialPolygons对象,一种方法是首先指定要绘制的地理范围,然后使用plot(..., add=TRUE)。这将仅向地图添加感兴趣的点。

使用投影进行绘图(例如,多边形投影)需要首先使用spTransform()包中的rgdal函数来确保所有图层都在同一投影中。

## Specify a geographic extent for the map
## by defining the top-left and bottom-right geographic coordinates
mapExtent <- rbind(c(-156, 80), c(-68, 19))

## Specify the required projection using a proj4 string
## Use http://www.spatialreference.org/ to find the required string
## Polyconic for North America
newProj <- CRS("+proj=poly +lat_0=0 +lon_0=-100 +x_0=0 
            +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")

## Project the map extent (first need to specify that it is longlat) 
mapExtentPr <- spTransform(SpatialPoints(mapExtent, 
                  proj4string=CRS("+proj=longlat")),
                  newProj)

## Project other layers
can1Pr <- spTransform(can1, newProj)
us1Pr <- spTransform(us1, newProj) 

## Plot each projected layer, beginning with the projected extent
plot(mapExtentPr, pch=NA)
plot(can1Pr, border="white", col="lightgrey", add=TRUE)
plot(us1Pr, border="white", col="lightgrey", add=TRUE)

可以使用相同的方法轻松地在地图中添加其他功能,例如突出显示感兴趣的管辖区域:

## Highlight provinces and states of interest
theseJurisdictions <- c("British Columbia",
                        "Yukon",
                        "Northwest Territories",
                        "Alberta",
                        "Montana",
                        "Alaska")

plot(can1Pr[can1Pr$NAME_1 %in% theseJurisdictions, ], border="white", 
    col="pink", add=TRUE)

plot(us1Pr[us1Pr$NAME_1 %in% theseJurisdictions, ], border="white", 
    col="pink", add=TRUE)

结果如下:

enter image description here

使用投影时添加网格线非常复杂,我认为它需要另一个帖子。看起来好像@Mark Miller在下面添加了它!

答案 1 :(得分:4)

下面我修改了PaulG显示纬度 - 经度网格的出色答案。网格比我想要的更粗,但可能就足够了。我使用英国的代码如下。我不知道如何在这篇文章中包含结果。

library(rgdal)
library(raster)

# define extent of map area
mapExtent <- rbind(c(0, 62), c(5, 45))

# BNG is British National Grid    
newProj <- CRS("+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.999601271625 
           +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs") 

mapExtentPr <- spTransform(SpatialPoints(mapExtent, 
                  proj4string=CRS("+proj=longlat")),
                  newProj)

# provide a valid 3 letter ISO country code
# obtain a list with: getData("ISO3")
uk0 <- getData('GADM', country="GBR", level=0) # UK
uk1 <- getData('GADM', country="GBR", level=1) # UK countries
uk2 <- getData('GADM', country="GBR", level=2) # UK counties

# United Kingdom projection
uk1Pr      <- spTransform(uk1, newProj)

# latitude-longitude grid projection
grd.LL     <- gridlines(uk1, ndiscr=100)
lat.longPR <- spTransform(grd.LL, newProj)

# latitude-longitude text projection
grdtxt_LL  <- gridat(uk1)
grdtxtPR   <- spTransform(grdtxt_LL, newProj)

# plot the map, lat-long grid and grid labels
plot(mapExtentPr, pch=NA)
plot(uk1Pr, border="white", col="lightgrey", add=TRUE)
plot(lat.longPR, col="black", add=TRUE)
text(coordinates(grdtxtPR),
   labels=parse(text=as.character(grdtxtPR$labels)))

结果如下:

enter image description here