我之前编写了一个脚本来创建美国的彩色地图,每个州都根据一些模拟数据着色。这个想法是以后能够用一些措施替换模拟数据。它被写成是自包含的并且最初运行得很好,但是现在在fortify {ggplot2}
命令运行时崩溃了。
我认为这是由于fortify
命令的问题,因为它返回致命错误并在该点重新启动R.这是致命错误的代码:
###Load libraries
library(maptools)
library(ggplot2)
library(ggmap)
library(rgdal)
library(dplyr)
#Set working directory to where you want your files to exist (or where they already exist)
#Download, read and translate coord data for shape file of US States
if(!file.exists('tl_2014_us_state.shp')){
download.file('ftp://ftp2.census.gov/geo/tiger/TIGER2014/STATE/tl_2014_us_state.zip',
'tl_2014_us_state.zip')
files <- unzip('tl_2014_us_state.zip')
tract <- readOGR(".","tl_2014_us_state") %>% spTransform(CRS("+proj=longlat +datum=WGS84"))
} else {
tract <- readShapeSpatial("./tl_2014_us_state.shp") #%>% spTransform(CRS("+proj=longlat +datum=WGS84"))
}
# shape<-readShapeSpatial("./fao/World_Fao_Zones.shp")
#Download reference data for state names and abbreviations - a matter of convenience if there are
#states for which you have no data
if(!file.exists('states.csv')){
download.file('http://www.fonz.net/blog/wp-content/uploads/2008/04/states.csv',
'states.csv')
states <- read.csv('states.csv')
} else {
states <- read.csv('states.csv')
}
#simulated data for plotting values of some 'characteristic'
mydata <- data.frame(rnorm(51, 0, 1)) #51 "states" in the state dataset
names(mydata)[1] <- 'value' #give the simulated column of data a name
#Turn geo data into R dataframe
tract_geom<-fortify(tract,region="STUSPS") #STUSPS is the state abbreviation which will act as a key for merge
脚本在上面一行停止工作,并在发生致命错误时崩溃。我尝试了another post中描述的解决方法,在其中放置了明确的&#34; id&#34;空间数据框中的列,默认情况下fortify
将用作关键字。通过这个修改线:
tract@data$id <- tract@data$STUSPS
tract_geom <- fortify(tract)
将替换上一代码中的tract_geom<-fortify(tract,region="STUSPS")
,
其中STUSPS是后来数据合并的关键。
不幸的是,当我加强道数据时,id列不是预期的状态缩写,而是&#34; 0&#34;之间的字符向量。和&#34; 55&#34; (56个独特的价值观)。似乎州的缩写(其中有56个)以某种方式被转换为数字然后转换为字符。
我正在研究为什么会发生这种情况并寻找解决方法。如果fortify函数与region
参数一起使用,那将是理想的,但如果我可以使解决方法起作用,那也会很棒。任何帮助将不胜感激。我查看了文档和各种类似问题的解决方案,并且做得很简单(甚至尝试过ArcGIS)。
答案 0 :(得分:2)
尝试:
readOGR(..., stringsAsFactors=FALSE, ...)
答案 1 :(得分:0)
我能够通过运行io.py
来解决我自己的问题。我不完全确定哪个软件包是罪魁祸首,但可能是sys.path
,update.packages()
或maptools
,因为这些软件包属于要更新的软件包中影响了这个问题。
最后,在更新之后,脚本以原始形式运行,行rgdal
保持不变。感谢那些帮助我解决这个问题的人。