空間分析  實習二

助教 杜承軒 2021.03.15

擷取麥當勞店家位置
1. 以台北市為範圍,麥當勞 1 km為服務範圍內所涵蓋的麥當勞分店數,定義為該家麥當勞店家的連鎖密度,請問哪一家麥當勞的連鎖密度最高? 繪製在地圖上,並標示該店家名稱。
2. 以台北市為範圍,麥當勞 1 km為服務範圍。以台北市各里中心點是否在涵蓋該麥當勞的服務範圍,作為判斷該麥當勞是否能服務到該里的標準。請問哪個里可被麥當勞服務的家數最多?繪製在地圖上,並標示該里的位置及可及的麥當勞店家。


*初步環境建置與讀取檔案

library(sf);library(tmap);library(dplyr);library(units)
setwd("D:/1092SA/Data")
TPE=st_read("Taipei_Vill.shp", options="ENCODING=BIG5")
FF=st_read("Tpe_Fastfood.shp", options="ENCODING=BIG5")
MC=FF[FF$STORE=="MIC",]
dist=1000

  1. 連鎖密度最高的麥當勞
#way 1. Buffer + Clip
 MC.buffer=st_buffer(MC,dist)
 MC.den=c()
 for(i in 1:nrow(MC)) MC.den[i]=nrow(MC[MC.buffer[i,],])
 MC.MAX=MC[which.max(MC.den),]

#way 2. Buffer + Intersect
 MC.buffer=st_buffer(MC,dist)
 MC.inter=st_intersection(MC.buffer,MC) #或st_join
 MC.table=as.data.frame(xtabs(~ID,MC.inter)) 
 MC.MAX.ID=MC.table$ID[which.max(MC.table$Freq)]
 MC.MAX=MC[MC$ID==MC.MAX.ID,]

#way 3. Distance
 MC.dist=st_distance(MC)
 MC.dist.mat=MC.dist<set_units(1,km)
 MC.den=apply(MC.dist.mat,1,sum)
 MC.MAX=MC[which.max(MC.den),]

#way 4. WithinDistance(list)
 MC.WD=st_is_within_distance(MC,dist=dist)
 MC.den=unlist(lapply(MC.WD,length))
 MC.MAX=MC[which.max(MC.den),]

#way 5. WithinDistance(matrix)
 MC.WD=st_is_within_distance(MC,dist=dist,sparse = F)
 MC.den=apply(MC.WD,1,sum)
 MC.MAX=MC[which.max(MC.den),]

#PLOT
 TPE.TOWN=summarize(group_by(TPE, TOWN))
 
 tm_shape(TPE.TOWN)+tm_polygons()+
   tm_shape(MC)+tm_dots(col='blue',size=.2)+
   tm_shape(MC.MAX)+tm_dots(col='red',size=1)+
   tm_layout(frame=F)

## [1] "麥當勞(台北館前)"

  1. 可被麥當勞服務的家數最多的村里
TP=st_centroid(TPE)

#way 1. Buffer + Clip
 TP.MC=c()
 for(i in 1:nrow(TP)) TP.MC[i]=nrow(MC.buffer[TP[i,],])
 TP.MAX=TP[which.max(TP.MC),]
 TP.MAX.MC=MC.buffer[TP.MAX,]

#way 2. Buffer + Intersect
 TP.MC.inter=st_intersection(MC.buffer,TP) #或st_join
 TP.table=as.data.frame(xtabs(~V_ID,TP.MC.inter)) 
 TP.MAX.ID=TP.table$V_ID[which.max(TP.table$Freq)]
 TP.MAX=TP[TP$V_ID==TP.MAX.ID,]
 TP.MAX.MC=TP.MC.inter[TP.MC.inter$V_ID==TP.MAX.ID,]

#way 3. Distance
 TP.MC.dist=st_distance(TP,MC)
 TP.MC.dist.mat=TP.MC.dist<set_units(1,km)
 TP.MC.count=apply(TP.MC.dist.mat,1,sum)
 id=which.max(TP.MC.count)
 TP.MAX=TP[id,]
 TP.MAX.MC=MC[TP.MC.dist.mat[id,],]

#way 4. WithinDistance(list)
 TP.MC.WD=st_is_within_distance(TP,MC,dist=dist)
 TP.MC.count=unlist(lapply(TP.MC.WD,length))
 id=which.max(TP.MC.count)
 TP.MAX=TP[id,]
 TP.MAX.MC=MC[TP.MC.WD[[id]],]

#way 5. WithinDistance(matrix)
 TP.MC.WD.mat=st_is_within_distance(TP,MC,dist=dist,sparse=F)
 TP.MC.count=apply(TP.MC.WD.mat,1,sum)
 id=which.max(TP.MC.count)
 TP.MAX=TP[id,]
 TP.MAX.MC=MC[TP.MC.WD.mat[id,],]


#PLOT
 TPE.MAX=TPE[TPE$V_ID==TP.MAX$V_ID,]
 tmap1=tm_shape(TPE)+tm_polygons()+
   tm_shape(TPE.MAX)+tm_polygons(col='red',size=.5)+
   tm_shape(TP.MAX.MC)+tm_dots(col='blue',size=.2)+
   tm_layout(frame=F)
 
 tmap2=tm_shape(TP.MAX.MC)+tm_dots(col='blue',size=.2)+
   tm_shape(TPE.MAX)+tm_polygons(col='red',size=.5,alpha = 0.5)+
   tm_shape(TPE)+tm_borders()+
   tm_layout(frame=F)
 
 tmap_arrange(tmap1,tmap2,ncol=2,nrow=1)

## [1] "正得里"

加分題

#Q1
  DAAN=TPE[TPE$TOWN=="大安區",]
  FF.DAAN=FF[DAAN,] #在大安區的速食店
  xtabs(~STORE,FF.DAAN)
## STORE
## KFC MIC 
##   2  11
#Q2
  FF.TP=st_intersection(FF,TPE)
  xtabs(~TOWN+STORE,FF.TP)
##         STORE
## TOWN     KFC MIC
##   士林區   2   8
##   大同區   1   3
##   大安區   2  11
##   中山區   4   9
##   中正區   2   8
##   內湖區   2   5
##   文山區   1   7
##   北投區   1   5
##   松山區   2   8
##   信義區   1   8
##   南港區   0   3
##   萬華區   2   3
#Q3
  M=FF[FF$STORE=="MIC",]
  M.1k.sep=st_buffer(M,1000)
  M.1k=st_union(M.1k.sep)
  tm_shape(M.1k)+tm_polygons()+tm_shape(M)+tm_dots()