医療機関リスト+地図をHTMLレポートにする
医療機関の住所ってのはなぜかPDFで公開されていたりして非常に加工しにくい。
しかしこれをPerlで加工して公開してくださっている方がいる。
保険医療機関一覧データ保管庫
せっかく公開されているので地図にプロットしてみたい。
今回は自分の住所を入力して、その近くの医療機関をリストアップ+プロットという形で最終的にHTMLに出力する形とした。
あとで詳細は書く。
library(RCurl) library(bitops) library(XML) #上記サイトの20110301.zipを今回用いた。 #ダウンロードしてきた医療機関データを読み込む(今回はdata1.tsvの100件のみ) d <- read.delim("data1.tsv", nrows=100,stringsAsFactors=FALSE) #googleジオコーディングを利用して緯度と経度を取得する locationdata <- d$住所 #取得関数の定義 getGIS <- function(locationdata){ data <- NULL for(count in 1:length(locationdata)){ location <- locationdata[count] if(Sys.getlocale("LC_CTYPE")=="Japanese_Japan.932"){ Encodelocation <-paste(c("",charToRaw(iconv(location,"CP932","UTF-8"))),collapse="%") }else{ Encodelocation <-paste(c("",charToRaw(location)),collapse="%") } url <- paste("http://maps.google.com/maps/api/geocode/xml?address=",Encodelocation,"&sensor=false", sep="") xml <- getURL(url) lat <-as.numeric(xmlValue(xmlRoot(xmlTreeParse(xml))[["result"]][["geometry"]][["location"]][["lat"]])) lon <-as.numeric(xmlValue(xmlRoot(xmlTreeParse(xml))[["result"]][["geometry"]][["location"]][["lng"]])) data0 <- data.frame(lat=lat, lon=lon, stringsAsFactors=FALSE) data <- rbind(data, data0) } return(data) } latlon <- getGIS(locationdata) d2 <- cbind(d, latlon) d2 <- d2[!is.na(d2$lat), ] #自分の住所を入力する→緯度経度への変換 myaddress <- "松山市大手町1丁目1番1号" mylatlon <- getGIS(myaddress) #その範囲に入る医療機関を抽出する→今回は住所の緯度経度+0.01の範囲 myrange <- 0.01 d3 <- d2[d2$lat >= (mylatlon$lat-myrange) & d2$lon >=(mylatlon$lon-myrange) & d2$lat <=(mylatlon$lat+myrange) & d2$lon <=(mylatlon$lon+myrange), ] ###医療機関を表示する(医科、歯科、薬局)→医療機関リスト+地図(RgoogleMapsで自分の住所を中心に) #google static map API用にマーカーを作成(自分の住所はマーカーの色が青になるように指定) library(RgoogleMaps) mymarkers <- "" for(i in 1:nrow(d3)){ loc <- paste(d3[i,"lat"],d3[i,"lon"], sep=",") lab <- paste("label:", LETTERS[i], sep="") m1 <- paste(lab, loc, sep="|") mymarkers <- paste(mymarkers, m1, sep="&markers=") } myloc <- paste(mylatlon, collapse=",") myloc <- paste("&markers=color:blue|", myloc, sep="") mymarkers <- paste(myloc, mymarkers, sep="") GetMap(markers = mymarkers, destfile = "Mymap.png") #メッセージがでるが気にせずyを押す ###マップと住所を整形してレポートをHTMLで出力 output <- d3[, c(6, 7, 8)] #施設名、郵便番号、住所を出力用に抽出 rownames(output) <- LETTERS[1:nrow(d3)] #マーカーのアルファベットに合わせる library(hwriter) p <- openPage("report.html", charset="shift-jis") #医療機関データの文字コードがshift-jisであるため img <- hwriteImage('Mymap.png', br=FALSE, width=500) doc <- hwrite(output) hwrite(c(img, doc), p, border=0) closePage(p) #これで作業ディレクトリ(getwd()で確認可能)にHTMLレポートが出力されているはず。