R 地图不';不要注册奇怪的形状
我正在和我的一位教授一起进行一些研究,旨在改进目前的碳核算方法。我们注意到,如果没有位置数据,则点源的许多位置默认为其所在县的质心(这是目前美国特有的,但将在全球范围内应用) 所以我用R来解决与这些位置相关的不确定性。我的代码获取一个县的经纬度范围,并绘制10000个点。然后剔除不在县里的点,取剩余点的平均值来定位质心。我的目标是最终获得这些点和质心之间的差异,以找到放置在质心中的点源的空间不确定性 然而,我在沿海地区遇到了问题。我的第一个问题是,“地图”包忽略了孤岛(例如屏障孤岛)以及其他不相交的县城形状,因此在对点进行平均时无法准确地再现质心。我的第二个问题是在库里托克县(北卡罗来纳州)发现的。地图似乎能识别出这个县的部分屏障岛屿,但由于它不是连续的,整个功能都不稳定,产生了一堆与该县实际边界完全不符的“NAs”和“FALSE” (质心的数据将用于研究的其他领域,这就是为什么我们能够准确地访问所有县很重要。) 有没有办法避免我遇到的错误?可以读入的不同数据集,或任何类似的数据集?非常感谢你的帮助。如果对我的问题有任何疑问,请告诉我,我很乐意澄清 代码: ggplot2有帮助 一些麻烦县:北卡罗来纳州、库里托克和马萨诸塞州、杜克斯R 地图不';不要注册奇怪的形状,r,google-maps,google-maps-api-3,maps,spatial,R,Google Maps,Google Maps Api 3,Maps,Spatial,我正在和我的一位教授一起进行一些研究,旨在改进目前的碳核算方法。我们注意到,如果没有位置数据,则点源的许多位置默认为其所在县的质心(这是目前美国特有的,但将在全球范围内应用) 所以我用R来解决与这些位置相关的不确定性。我的代码获取一个县的经纬度范围,并绘制10000个点。然后剔除不在县里的点,取剩余点的平均值来定位质心。我的目标是最终获得这些点和质心之间的差异,以找到放置在质心中的点源的空间不确定性 然而,我在沿海地区遇到了问题。我的第一个问题是,“地图”包忽略了孤岛(例如屏障孤岛)以及其他不相
library(ggplot2)
library(maps) # package has maps
library(mapproj) # projections
library(sp)
WC <- map_data('county','north carolina,currituck') #calling on county
p <- ggplot(data = WC, aes(x = long, y = lat)) #calling on latitude and longitude
p1 <- p + geom_polygon(fill = "lightgreen") + theme_bw() +
coord_map("polyconic") + coord_fixed() #+ labs(title = "Watauga County")
p1
### range for the long and lat
RLong <- range(WC$long)
RLong
RLat <- range(WC$lat)
RLat
### Add some random points
n <- 10000
RpointsLong <- sample(seq(RLong[1], RLong[2], length = 100), n, replace = TRUE)
RpointsLat <- sample(seq(RLat[1], RLat[2], length = 100), n, replace = TRUE)
DF <- data.frame(RpointsLong, RpointsLat)
head(DF)
p2<-p1 + geom_point(data = DF, aes(x = RpointsLong, y = RpointsLat))
p2
# Source:
# http://www.nceas.ucsb.edu/scicomp/usecases/GenerateConvexHullAndROIForPoints
inside <- map.where('county',RpointsLong,RpointsLat)=="north carolina,currituck"
inside[which(nchar(inside)==2)] <- FALSE
inside
g<-inside*DF
g1<-subset(g,g$RpointsLong!=0)
g1
CentLong<-mean(g1$RpointsLong)
CentLat<-mean(g1$RpointsLat)
Centroid<-data.frame(CentLong,CentLat)
Centroid
p1+geom_point(data=g1, aes(x=RpointsLong,y=RpointsLat)) #this maps all the points inside county
p1+geom_point(data=Centroid, aes(x=CentLong,y=CentLat))
库(ggplot2)
库(地图)#包中有地图
图书馆(mapproj)#投影
图书馆(sp)
WC首先,根据您对问题的描述,我可能会投入大量精力来避免位置默认为县质心的业务-这是解决此问题的正确方法
第二,如果这是一个研究项目,我不会在R中使用内置的地图。美国地质调查局的网站有很好的功能。下面是在北卡罗来纳州使用Currituck县的示例
library(ggplot2)
library(rgdal) # for readOGR(...)
library(rgeos) # for gIntersection(...)
setwd("< directory contining shapefiles >")
map <- readOGR(dsn=".",layer="countyp010")
NC <- map[map$COUNTY=="Currituck County" & !is.na(map$COUNTY),]
NC.df <- fortify(NC)
bbox <- bbox(NC)
x <- seq(bbox[1,1],bbox[1,2],length=50) # longitude
y <- seq(bbox[2,1],bbox[2,2],length=50) # latitude
all <- SpatialPoints(expand.grid(x,y),proj4string=CRS(proj4string(NC)))
pts <- gIntersection(NC,all) # points inside the polygons
pts <- data.frame(pts@coords) # ggplot wants a data.frame
centroid <- data.frame(x=mean(pts$x),y=mean(pts$y))
ggplot(NC.df)+
geom_path(aes(x=long,y=lat, group=group), colour="grey50")+
geom_polygon(aes(x=long,y=lat, group=group), fill="lightgreen")+
geom_point(data=pts, aes(x,y), colour="blue")+
geom_point(data=centroid, aes(x,y), colour="red", size=5)+
coord_fixed()
库(ggplot2)
图书馆(rgdal)#用于readOGR(…)
图书馆(rgeos)#金特区(…)
setwd(“”)
映射不是我们将点源默认为质心,而是eGrid数据。这些位置由发电厂自己报告,如果没有报告,则默认为质心。这就是我们进行这项研究的部分原因。关于点源的一切都是非常时髦和不准确的。谢谢你的帮助!我不了解您项目的细节,但我建议,如果,例如,发电厂报告其排放量,但不报告其位置,则使用单独的数据源对发电厂进行地理定位是值得的。你一定有地址,不是吗?你不能给它们编地理编码吗?
polys <- do.call(rbind,lapply(NC@polygons[[1]]@Polygons,
function(x)c(x@labpt,x@area)))
polys <- data.frame(polys)
colnames(polys) <- c("long","lat","area")
polys$area <- with(polys,area/sum(area))
centr <- with(polys,c(x=sum(long*area),y=sum(lat*area)))
centr # area weighted centroid
# x y
# -76.01378 36.40105
centroid # point weighted centroid (start= 50 X 50 points)
# x y
# 1 -76.01056 36.39671