R 打印带有ggplot2错误的形状文件

R 打印带有ggplot2错误的形状文件,r,ggplot2,sas,R,Ggplot2,Sas,在过去的几天里,我几乎是一头扎进了使用R进行映射的领域。我曾广泛使用R进行建模等工作,但以前没有这样的工作。我有一些关于形状文件的问题,如何阅读它们等等 我已经从网站下载了形状文件,有很多带有国家边界、邮政编码、城市等的文件。 形状文件是巨大的,澳大利亚州边界有大约180万个坐标点,我尝试的另一个文件是统计区域,其中有超过800万个。我没有对这个文件做任何处理,因为它对于我的R设置来说太大了 我用readShapePoly读取了形状文件,并将其进行了如下转换 AUS@data$id = rown

在过去的几天里,我几乎是一头扎进了使用R进行映射的领域。我曾广泛使用R进行建模等工作,但以前没有这样的工作。我有一些关于形状文件的问题,如何阅读它们等等

我已经从网站下载了形状文件,有很多带有国家边界、邮政编码、城市等的文件。 形状文件是巨大的,澳大利亚州边界有大约180万个坐标点,我尝试的另一个文件是统计区域,其中有超过800万个。我没有对这个文件做任何处理,因为它对于我的R设置来说太大了

我用
readShapePoly
读取了形状文件,并将其进行了如下转换

AUS@data$id = rownames(AUS@data)    
AUS.points = fortify(AUS, region="id")
AUS.df = join(AUS.points, AUS@data, by="id")
一旦我将州边界形状文件从
SpatialPolygonsDataFrame
转换为常规数据帧,我就成功地绘制了它,但它花费了很长时间,而且细节太大。 我本想使用
thinkdspatialpoly
来简化它,但它给出了一个错误:

Error in stopifnot(length(Sr@polygons) == nrow(data)) :trying to get slot "polygons" from an object of a basic class ("NULL") with no slots
谷歌帮不了我

我的下一个策略是将其读入SAS并使用
proc greduce
,它获取文件并创建一个密度场,您可以选择多边形的密度

proc mapimport out=states datafile='\Digital Boundaries\States\Shape file\STE_2011_AUST.shp';
id ste_code11;    run;
proc greduce data = states out = reduced_states;
id ste_code11;    run;
SAS有垃圾图形,甚至不能为我绘制东西,所以我导出了数据集,并用新的密度字段将其读回R,我希望用它来子集数据帧,并在我的绘图中使用

我现在的问题是,当我在R中绘图时,我得到了这个

ggplot(data=states.df, aes(X, Y, group=SEGMENT)) + 
geom_polygon(colour='black', fill='white') + theme_bw()
我猜这是因为多边形不整齐或者已经断裂?我使用此函数尝试重新连接多边形,但仍然没有成功

RegroupElements <- function(df, longcol, idcol){
g <- rep(1, length(df[,longcol]))
if (diff(range(df[,longcol])) > 300) { # check if longitude within group differs more                than 300 deg, ie if element was split
d <- df[,longcol] > mean(range(df[,longcol])) # we use the mean to help us separate the   extreme values
g[!d] <- 1 # some marker for parts that stay in place (we cheat here a little, as we do not take into account concave polygons)
g[d] <- 2 # parts that are moved 
}
g <- paste(df[, idcol], g, sep=".") # attach to id to create unique group variable for   the dataset
df$group.regroup <- g
df
}

### Function to close regrouped polygons
# Takes dataframe, checks if 1st and last longitude value are the same, if not, inserts  first as last and reassigns order variable
ClosePolygons <- function(df, longcol, ordercol){
if (df[1,longcol] != df[nrow(df),longcol]) {
tmp <- df[1,]
df <- rbind(df,tmp)
}
o <- c(1: nrow(df)) # rassign the order variable
df[,ordercol] <- o
df
}  

首先,如果你是头朝下跳水,不要进入浅水区

我的旧电脑可以以shapefile格式读取州数字边界没有问题:

aus=readOGR(".","STE_2011_AUST")
plot(aus)
但地图显然过于详细。我还把它装进了量子地理信息系统,这样我可以有一个很好的老变焦和平移,每个小岛都在那里。我认为这是我见过的最详细的国家级地图之一。因此,第二,您可能想尝试找到一个简单的州地图(参见www.gadm.org了解可能的情况)

因此,让我们看看包中的
gSimplify
:rgeos是否有助于:

aus2 = gSimplify(aus,0.1)
plot(aus2)
这移除了许多小岛,但不幸的是,对我(和大部分人口)来说,它也移除了新南威尔士州。不好的。如果我最终降低公差,我可以得到一些保持新南威尔士州的东西:

aus2 = gSimplify(aus,0.01)
plot(aus2)
但很明显,gSimplify或shapefile数据本身存在一些问题。无论如何,如果我将aus2保存回一个shapefile,那么它的大小会大大减小,.shp是180k,而不是29兆字节


此外,我会坚持使用基本图形进行绘图。

如果对您有效,请尝试使用rgdal:readOGR来读取您的形状文件。在地图上使用sp base图形。此外,如果这些边界太详细,请尝试www.gadm.org上的边界-它们可能没有那么权威,但它们可能足够适合您的工作。+1表示非常奇怪的结果triangulation@Spacedman我最初打算使用readOGR,在我的个人计算机上,它工作正常,但在工作中,rgdal.dll有一个问题,“无法使用共享库”。我选择不必处理我们的IT,只是使用了不同的软件包Hanks作为答案,我错误地认为您必须在绘图之前将shp文件转换为数据帧!当我有机会时,我会使用
gSimplify
我自己
aus2 = gSimplify(aus,0.01)
plot(aus2)