kmlラボ
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
&color(black,#CCFFCC){LINK:[[[GoogleEarthとR]]][[[ShapeFi...
----
目次
#contents
----
*目的 [#f6347ee0]
rgdalパッケージのwriteOGR関数を使うと、ShapeFileからKMLフ...
そこでXMLパッケージを用いて、作成されたKMLファイルを操作...
注)ここは、「KMLの公開」を目的としたサイトではありません...
*対応表 [#d03e0725]
RとXMLパッケージのバージョンによってはうまく動かないので...
推奨環境:Windows: R2.9.2 - XML1.96~
-Windows: R2.9.2 - XML1.9.6 O
-Windows: R2.7.2 - XML1.94 O (CDATA内部の日本語文字化け...
install.packages("XML", repos = "http://www.omegahat.org/...
-Windows: R2.7.2 - XML1.96 X (CDATA内部の日本語文字化け...
-Windows: R2.6.2 - XML1.94 O~
-MacOSX10.5.5: R2.7.2 O~
~
*関連リンク [#w425a615]
すばらしいサイトです。ここで勉強させてもらってます。~
[[TME:http://thematicmapping.org/]]~
[[EarthAtlas:http://earthatlas.info/?kml=http://www.natur...
*kmlライブラリ [#qca3a38d]
公開データの著作権等について:~
*「地域境界KMLFileデータの作成に当たっては、ESRIジャパン...
*「地域メッシュKMLFileデータの作成にあたっては、財団法人...
|50|150|250|100|300|100|c
|県コード|CENTER:地域名称|CENTER:地域境界KMLFile|CENTER:...
|#|日本全図|#ref(kmlライブラリ/japank.kml)|第1次地域区画...
|#|日本全図||第2次地域区画|#ref(kmlライブラリ/StdMesh02....
|01|北海道|#ref(kmlライブラリ/hokkaido.kml)|1kmメッシュ...
|02|青森県|#ref(kmlライブラリ/aomori.kml)|1kmメッシュ|#...
|03|岩手県|#ref(kmlライブラリ/iwate.kml)|1kmメッシュ|||
|04|宮城県|#ref(kmlライブラリ/miyagi.kml)|1kmメッシュ|||
|05|秋田県|#ref(kmlライブラリ/akita.kml)|1kmメッシュ|||
|10|群馬県|#ref(kmlライブラリ/gunma.kml)||||
**国勢調査のデータのダウンロード [#o3ee385b]
http://www.e-stat.go.jp/SG2/toukeichiri/TopFrame.do?fromP...
*コメント欄 [#w89db461]
#comment(below)
- XML対応表更新 -- [[okinawa]] &new{2009-11-30 (月) 18:21...
- maptoolsにkmlLine,kmlPolygon関数が追加されました。これ...
- さて、そろそろ2次メッシュにいこか・・・。 -- [[okinawa...
- メッシュkmlデータの作成:1次メッシュ生成関数作成終了。 -...
- メッシュkmlデータの作成更新。メッシュを連続生成できるよ...
- メッシュkmlデータの作成を追加。現在、初期段階のコードで...
- GE5向けにkmlFunctions.rを変更しました。今後、ここの内容...
- データを読み込んでkmlを再構成する(2) 那覇市国勢調査...
- 今後、TMEの技術を取り入れていこうと思います。・・・まだ...
- ここの名称を「kmlラボ」に変更しました。 -- [[okinawa]] ...
- kmlFunctions.rバグ修正。 -- [[okinawa]] &new{2008-11-26...
- useInternalNodes = TRUEを使わんといかんのか・・・。utf-...
- 那覇市の周辺市町村(浦添市、豊見城市、南風原町)を同時...
- getCDATA関数復活。これでPlaceMark名にCDATA内の指定デー...
- MacOSXでrgdalを使えるようにするを追加。これでMacでもKML...
- 明日、那覇市長選がある。那覇市国勢調査編として分析した...
- kmlFunctions.rのsetAltitude()にラベルのパラメータ指定を...
- kmlFunctions.rバグ取り&ちょっと修正。 -- [[okinawa]] &...
- データを読み込んでkmlを再構成する(2) 那覇市国勢調査...
- kmlAltitudeNode関数修正、setAltitudeMesh関数をsetAltitu...
- 次はメッシュデータを自動でつくってみます。 -- [[okinawa...
- データを読み込んで、kmlを再構成するを追加。shapefileか...
- kmlFunctions.r追加。 -- [[okinawa]] &new{2008-11-06 (木...
- colors.kml関数追加しました。 -- [[okinawa]] &new{2008-1...
- getKmlNode関数追加。ノードを指定してKMLの切り抜きができ...
- 関数追加。あとは色の変換関数がいるな。 -- [[okinawa]] &...
- 関数を若干修正 -- [[okinawa]] &new{2008-10-23 (木) 08:5...
- 地域メッシュKMLデータの応用追加 -- [[okinawa]] &new{200...
- kmlファイルをRから直接いじってみました。今後は、ライブ...
*kmlデータをXMLパッケージで再構成する関数 [#p7c92b92]
writeOGRで出力されたkmlデータをXMLパッケージを用いて再構...
(構造決めうちなので、[[ShapeFileライブラリ]]のデータをwri...
***kmlFunctions.r [#rb911ac6]
kmlを操作する関数をまとめました。下記のように、適当な場所...
#ref(kmlラボ/kmlFunctions.r)~
古いものは↓
#ref(kmlライブラリ/kmlFunctions.r)~
library(XML) #宣言
source("c:/kmlFunctions.r")#ソースの読み込み
doc <- xmlTreeParse("c:/gunma.kml")#土台となるkmlファイ...
data<-sample(1000:10000,39) #高度データを自動生成
fillcolor<-colors.kml(heat.colors(39),"EE")#色の割り当て...
linecolor<-NA#色の割り当て(線)
x<-kmlAltitudeNode(doc,data,fillcolor,linecolor)#kmlファ...
saveXML(x,"c:/gunma2.kml",prefix = '<?xml version="1.0" ...
~
#ref(kmlライブラリ/color2.JPG,30%)~
***kmlAltitudeNode関数(GE5) [#n3382d3b]
kmlAltitudeNode<-function(doc,data,fillcolor,linecolor,e...
kmlnode <- xmlRoot(doc)
node0<-kmlnode[[1]]
kmlver5<-'http://www.opengis.net/kml/2.2" xmlns:gx="http...
kmlnode<-xmlNode("kml",node0,attrs=c(xmlns=kmlver5))
len1<-length(node0[[1]])
for(i in 2:len1){
if(MG==T){
node1<-node0[[1]][[i]][[2]][[1]]
}else if(MG==F){
node1<-node0[[1]][[i]][[2]]
}
node1<-addChildren(node1,xmlNode("extrude",extrude),xmlN...
node2<-node0[[1]][[i]][[3]][[2]]
node2<-xmlNode("PolyStyle",xmlNode("color",fillcolor[i-1...
#linecolor
node3<-node0[[1]][[i]][[3]][[1]]
node3<-xmlNode("LineStyle",xmlNode("color",linecolor))
#polygon
len2<-length(node0[[1]][[i]][[2]][[1]])
for(j in 1:len2){
x1<-xmlValue(node1[[j]][[1]][[1]])
x2<-rev(unlist(strsplit(x1," ")))
x3<-paste(x2,data[[i-1]],sep=",",collapse=" ")
node1[[j]][[1]][[1]]<-xmlNode("coordinates",x3)
}
#replace node
if(MG==T){
node0[[1]][[i]][[2]][[1]]<-node1
}else if(MG==F){
node0[[1]][[i]][[2]]<-node1
}
node0[[1]][[i]][[3]][[2]]<-node2
node0[[1]][[i]][[3]][[1]]<-node3
kmlnode[[1]]<-node0
}
return(kmlnode)
}
#sample
library(XML)
doc <- xmlTreeParse("c:/gunma.kml")
data<-sample(1000:10000,39)
fillcolor<-c("ff000000","ffff0000","ff00ff00","ff0000ff"...
linecolor<-"NA"
x<-kmlAltitudeNode(doc,data,fillcolor,linecolor)
saveXML(x,"c:/gunma2.kml",prefix = '<?xml version="1.0" ...
#ref(kmlライブラリ/xml1.JPG,30%)~
#ref(kmlラボ/gunma2.kml)~
***setAltitude関数(GE5) [#nb393eab]
ノード番号を指定してピンポイントでAltitudeをセットする。~
setAltitude<-function(kmlnode,nodeno,data,fillcolor,line...
#kmlnode <- xmlRoot(doc)
node0<-kmlnode[[1]]
kmlver5<-'http://www.opengis.net/kml/2.2" xmlns:gx="http...
kmlnode<-xmlNode("kml",node0,attrs=c(xmlns=kmlver5))
if(MG==T){
#altitude
node1<-node0[[1]][[nodeno]][[2]][[1]]
node1<-addChildren(node1,xmlNode("extrude",extrude),xmlN...
#fillcolor
node2<-node0[[1]][[nodeno]][[3]][[2]]
node2<-xmlNode("PolyStyle",xmlNode("color",fillcolor))
#linecolor
node3<-node0[[1]][[nodeno]][[3]][[1]]
node3<-xmlNode("LineStyle",xmlNode("color",linecolor))
#label
node4<-node0[[1]][[nodeno]]
node4<-addChildren(node4,xmlNode("name",label))
#polygon
len2<-length(node0[[1]][[nodeno]][[2]][[1]])
j<-1:len2
text1<-paste('x1<-xmlValue(node1[[',j,']][[1]][[1]]);x2<...
text2<-paste('x3<-paste(x2,data,sep=",",collapse=" ");no...
text<-paste(text1,text2,sep="")
eval(parse(text=text))
node0[[1]][[nodeno]]<-node4
node0[[1]][[nodeno]][[2]][[1]]<-node1
node0[[1]][[nodeno]][[3]][[2]]<-node2
node0[[1]][[nodeno]][[3]][[1]]<-node3
kmlnode[[1]]<-node0
}else if(MG==F){
#altitude
node1<-node0[[1]][[nodeno]][[2]]
node1<-addChildren(node1,xmlNode("extrude",extrude),xmlN...
#fillcolor
node2<-node0[[1]][[nodeno]][[3]][[2]]
node2<-xmlNode("PolyStyle",xmlNode("color",fillcolor))
#linecolor
node3<-node0[[1]][[nodeno]][[3]][[1]]
node3<-xmlNode("LineStyle",xmlNode("color",linecolor))
#label
node4<-node0[[1]][[nodeno]]
node4<-addChildren(node4,xmlNode("name",label))
#polygon
len2<-length(node0[[1]][[nodeno]][[2]][[1]])
j<-1:len2
text1<-paste('x1<-xmlValue(node1[[',j,']][[1]][[1]]);x2<...
text2<-paste('x3<-paste(x2,data,sep=",",collapse=" ");no...
text<-paste(text1,text2,sep="")
eval(parse(text=text))
node0[[1]][[nodeno]]<-node4
node0[[1]][[nodeno]][[2]]<-node1
node0[[1]][[nodeno]][[3]][[2]]<-node2
node0[[1]][[nodeno]][[3]][[1]]<-node3
kmlnode[[1]]<-node0
}
return(kmlnode)
}
getCDATANo関数と組み合わせて必要な場所のみ設定~
#sample
doc <- xmlTreeParse("c:/gunma.kml")
x<-xmlRoot(doc)
#1つめの地域
name<-"JCODE"
value<-"10366"
nodeno<-getCDATANo(x,name,value)
data<-1000
fillcolor<-c("ffff0000")
linecolor<-"ff000000"
x<-setAltitude(x,nodeno,data,fillcolor,linecolor)
#2つめの地域
name<-"JCODE"
value<-"10201"
nodeno<-getCDATANo(x,name,value)
data<-1000
fillcolor<-c("ffff00ff")
linecolor<-"ff000000"
x<-setAltitude(x,nodeno,data,fillcolor,linecolor)
#保存
saveXML(x,"c:/gunma2.kml",prefix = '<?xml version="1.0" ...
#ref(kmlライブラリ/xml4.JPG,30%)~
メッシュのKMLはMultiGeometoryノードが無いので、MGパラメー...
#sample
library(XML)
doc <- xmlTreeParse("c:/StdMesh01.kml")
kmlnode<-xmlRoot(doc)
#1
name<-"CODE"
value<-"3622"
nodeno<-getCDATANo(kmlnode,name,value)
data<-1000000
fillcolor<-c("ffff0000")
linecolor<-"ff000000"
kmlnode<-setAltitude(kmlnode,nodeno,data,fillcolor,linec...
#2
name<-"CODE"
value<-"3623"
nodeno<-getCDATANo(kmlnode,name,value)
data<-800000
fillcolor<-c("ffff00ff")
linecolor<-"ff000000"
kmlnode<-setAltitude(kmlnode,nodeno,data,fillcolor,linec...
#save
saveXML(kmlnode,"c:/StdMesh012.kml",prefix = '<?xml vers...
#ref(kmlライブラリ/color4.JPG,30%)~
***kmlNodeLength関数 [#y7fb430a]
kmlAltitudeNode関数を使うときに、kmlのノード数を知りたい...
#kmlNodeLength() ver 0.1.2
kmlNodeLength<-function(doc){
library(XML)
kmlnode <- xmlRoot(doc)
node0<-kmlnode[[1]]
len1<-length(node0[[1]])
return(len1)
}
#sample
library(XML)
doc <- xmlTreeParse("c:/gunma.kml")
kmlNodeLength(doc)
> #sample
> library(XML)
> doc <- xmlTreeParse("c:/gunma.kml")
> kmlNodeLength(doc)
[1] 40
注)先頭のノードに<name>gunma</name>が入っていますので、...
***getCDATAList関数 [#ic0a4023]
CDATA(HTML)の中身を取り出す。nameに対応する項目名を指定す...
getCDATAList<-function(doc,name){
getCDATA<-function(node,name){
x<-gsub(" ","",iconv(xmlValue(node),"utf-8","cp932"))
x<-unlist(strsplit(x,"<br/>\n"))
x<-x[[grep(name,x)]]
x<-gsub("<b>","",gsub("</b>","",gsub("<i>","",gsub("</i>...
#x<-iconv(x,"","utf-8")
return(x)
}
kmlnode <- xmlRoot(doc)
node0<-kmlnode[[1]]
len1<-length(node0[[1]])
x<-NULL
for(i in 2:len1){
x[i-1]<-getCDATA(node0[[1]][[i]][[1]][[1]],name)
}
return(x)
}
#sample
doc <- xmlTreeParse("c:/gunma.kml")
name<-"CITY1"
getCDATAList(doc,name)
> #sample
> doc <- xmlTreeParse("c:/gunma.kml")
> name<-"CITY1"
> getCDATAList(doc,name)
[1] "前橋市" "高崎市" "桐生市" "伊勢崎市" ...
[11] "安中市" "みどり市" "富士見村" "榛名町" ...
[21] "南牧村" "甘楽町" "中之条町" "長野原町" ...
[31] "川場村" "昭和村" "みなかみ町" "玉村町" ...
> #sample
> doc <- xmlTreeParse("c:/gunma.kml")
> name<-"JCODE"
> getCDATAList(doc,name)
[1] "10201" "10202" "10203" "10204" "10205" "10206" "102...
[18] "10366" "10367" "10382" "10383" "10384" "10421" "10...
[35] "10521" "10522" "10523" "10524" "10525"
***getCDATA関数 [#vf724883]
CDATAのデータを取り出す。cdatanoは、grepで検索した場合、...
getCDATA<-function(kmlnode,name,nodeno=1,sep=":",cdatano...
node0<-kmlnode[[1]]
node1<-node0[[1]][[nodeno]][[1]][[1]]
#x<-gsub(" ","",xmlValue(node1))#mac
x<-gsub(" ","",iconv(xmlValue(node1),"utf-8","cp932"))
#print(x)
x<-unlist(strsplit(x,"<br/>\n"))
xno<-grep(name,x)
len<-length(xno)
if(len>1){
x<-x[[xno[cdatano]]]
}else if(len==1){
x<-x[[xno]]
}
#print(x)
x<-gsub("<b>","",gsub("</b>","",gsub("<i>","",gsub("</i>...
x<-gsub(paste(name,sep,sep=""),"",x)
return(x)
}
> #sample
> doc <- xmlTreeParse("/gunma.kml")
> kmlnode<-xmlRoot(doc)
> name<-"JCODE"
> nodeno<-2
> getCDATA(kmlnode,name,nodeno)
[1] "10201"
***getCDATANo関数 [#x4aa4dac]
nameとvalueを指定することで、CDATA(HTML)内のデータを検索...
#getCDATANo
getCDATANo<-function(kmlnode,name,value){
getCDATA2<-function(node,name){
x<-gsub(" ","",iconv(xmlValue(node),"utf-8","cp932"))
x<-unlist(strsplit(x,"<br/>\n"))
x<-x[[grep(name,x)]]
x<-gsub("<b>","",gsub("</b>","",gsub("<i>","",gsub("</i>...
#x<-iconv(x,"","utf-8")
return(x)
}
#kmlnode <- xmlRoot(doc)
namevalue<-paste(name,":",value,sep="")
node0<-kmlnode[[1]]
len1<-length(node0[[1]])
for(i in 2:len1){
if(namevalue==getCDATA2(node0[[1]][[i]][[1]][[1]],nam...
x<-i
break
}else{
x<-NA
}
}
return(x)
}
#sample
doc <- xmlTreeParse("c:/gunma.kml")
kmlnode<-xmlRoot(doc)
name<-"JCODE"
value<-"10366"
getCDATANo(kmlnode,name,value)
> #sample
> doc <- xmlTreeParse("c:/gunma.kml")
> name<-"JCODE"
> value<-"10366"
> getCDATANo(kmlnode,name,value)
[1] 19
***getKmlNode関数(GE5) [#udad8667]
ノードをnodenoで指定し、指定したノードの部分だけ抽出してK...
#getKmlNode
getKmlNode<-function(kmlnode,nodeno){
len<-length(nodeno)
node0<-kmlnode[[1]]
kmlver5<-'http://www.opengis.net/kml/2.2" xmlns:gx="http...
kmlnode<-xmlNode("kml",node0,attrs=c(xmlns=kmlver5))
node2<-xmlNode("Folder",xmlNode("name",as.character(node...
for(i in 1:len){
node1<-node0[[1]][[nodeno[[i]]]]
node2<-addChildren(node2,node1)
}
kmlnode[[1]][[1]]<-node2
return(kmlnode)
}
#sample
library(XML)
doc <- xmlTreeParse("c:/gunma.kml")
kmlnode<-xmlRoot(doc)
nodeno<-c(2,4,6)
expdata<-getKmlNode(kmlnode,nodeno)
saveXML(expdata,"c:/gunma3.kml",prefix = '<?xml version=...
***colors.kml関数 [#r236dd3e]
colors.kml("色名","アルファチャンネル")
colors.kml<-function(rgb=colors(),alpha="FF"){
colors.hex <- function( x=colors() ) {
color.hex <- function(x) do.call( "rgb", as.lis...
sapply( x, color.hex )
}
col.hex<-colors.hex(rgb)
red<-substr(col.hex,2,3)
green<-substr(col.hex,4,5)
blue<-substr(col.hex,6,7)
alpha<-alpha
col.kml<-paste(alpha,blue,green,red,sep="")
return(col.kml)
}
> colors.kml("red")
[1] "FF0000FF"
> colors.kml(rainbow(10))
[1] "FF0000FF" "FF0099FF" "FF00FFCC" "FF00FF33" "FF66FF...
[10] "FF9900FF"
参考:[[色見本]]~
*メッシュkmlデータの作成 [#t6141a60]
メッシュkmlデータを自動作成します。生成されたkmlはもちろ...
**makeMesh1関数:第1次地域区画(1次メッシュ)生成関数 [...
指定された地域メッシュコードを基に1次メッシュをブロック...
下記のDefaultMesh1.kmlをタネにして作成しますので、ダウン...
#ref(kmlラボ/DefaultMesh1.kml)~
makeMesh1<-function(kmlnode,codea,codeb){
transMeshCode<-function(code){
lat0<-as.integer(substr(code,1,2))/1.5
lon0<-as.integer(substr(code,3,4))+100
lat1<-lat0;lon1<-lon0+1;lat2<-lat0+(2/3);lon2<-lon1
lat3<-lat2;lon3<-lon0
x<-paste(lon0,",",lat0," ",lon1,",",lat1," ",lon2,",",la...
return(x)
}
code1<-as.integer(substr(codea,1,2))
code3<-as.integer(substr(codea,3,4))
code2<-as.integer(substr(codeb,1,2))
code4<-as.integer(substr(codeb,3,4))
print(code1)
print(code2)
print(code3)
print(code4)
node0<-kmlnode[[1]]
node1<-node0[[1]]
node2<-node0[[1]][[2]]
x<<-node0[[1]]
nodex<-removeChildren(x,kids=c("Placemark"))
for(j in code1:code2){
code01<-paste(as.character(j),code3,sep="")
code02<-paste(as.character(j),code4,sep="")
print(j)
for(i in code01:code02){
print(i)
node3<-node0[[1]][[2]][[1]][[1]]
node4<-node0[[1]][[2]][[2]][[1]][[1]][[1]]
CDATA<-paste("<b>CODE:</b><i>",i,"</i><br />\n",sep="")
node3<-xmlCDataNode(CDATA)
node4<-xmlNode("coordinates",transMeshCode(i))
node0[[1]][[2]][[2]][[1]][[1]][[1]]<-node4
node0[[1]][[2]][[1]][[1]]<-node3
node2<-node0[[1]][[2]]
nodex<-addChildren(nodex,node2)
}
node0[[1]]<-nodex
}
kmlnode[[1]]<-node0
return(kmlnode)
}
#Sample
library(XML)
doc <- xmlTreeParse("c:/DefaultMesh1.kml")
kmlnode <- xmlRoot(doc)
kmlnode2<-makeMesh1(kmlnode,3622,3643)#2つの区画を指定す...
saveXML(kmlnode2,"c:/meshdata.kml",prefix = '<?xml versi...
#ref(kmlラボ/mesh2.JPG,30%)~
1次メッシュ生成~
#Sample2:少々時間がかかります
library(XML)
doc <- xmlTreeParse("c:/DefaultMesh1.kml")
kmlnode <- xmlRoot(doc)
kmlnode2<-makeMesh1(kmlnode,3622,6853)
saveXML(kmlnode2,"c:/meshtest.kml",prefix = '<?xml versi...
#ref(kmlラボ/mesh4.JPG,30%)~
*応用編 [#me6a710e]
***データを読み込んでkmlを再構成する(1) [#cce8c1cb]
csvデータを読み込んで、kmlを再構成しています。JCODEでマッ...
#ref(kmlラボ/agedprop.csv)~
library(XML)
source("c:/kmlFunctions.r")
#kmlファイルの読み込み
doc <- xmlTreeParse("c:/gunma.kml")
kmlnode<-xmlRoot(doc)
#csvデータの取得
dat<-read.csv("c:/agedprop.csv")
data<-dat$AP2006
Altdata<-data*1000#高度
name<-"JCODE"#マッチング用指定
#色階層の割り当て
cutnum<-16
classes <- cut(data,seq(min(data),max(data),length=cutnu...
cols <- colors.kml(rev(heat.colors(cutnum)))
cols2<-cols[classes]
#kmlへの書き込み
len<-kmlNodeLength(doc)-1
for(i in 1:len){
value<-dat$JCODE[[i]]
print(value)
nodeno<-getCDATANo(kmlnode,name,value)#JCODEからノードを...
print(nodeno)
fillcolor<-cols2[[i]]
linecolor<-NA
kmlnode<-setAltitude(kmlnode,nodeno,Altdata[[i]],fillcol...
}
#kml保存
saveXML(kmlnode,"c:/gunma2.kml",prefix = '<?xml version=...
#ref(kmlライブラリ/color3.JPG,30%)~
***データを読み込んでkmlを再構成する(2) 那覇市国勢調査...
まず、那覇市国勢調査のデータ(平成17年)を地図で見る統...
http://www.e-stat.go.jp/SG2/toukeichiri/TopFrame.do?fromP...
(1)ダウンロードページ
#ref(kmlライブラリ/naha1.JPG,30%)
(2)世界測地系緯度経度Shape形式を落とします。
#ref(kmlライブラリ/naha2.JPG,30%)
(3)前準備~
落としたShapeFileから、writeOGRでKMLデータ(h17ka47201.km...
library(maptools)
library(rgdal)
x<-readShapePoly("c:/nahashi/h17ka47201.shp")
x@data$KEN_NAME<-iconv(x@data$KEN_NAME,"","utf-8")
x@data$GST_NAME<-iconv(x@data$GST_NAME,"","utf-8")
x@data$MOJI<-iconv(x@data$MOJI,"","utf-8")
tf <- "c:/nahashi/"
writeOGR(x, paste(tf, "h17ka47201.kml", sep=""), "h17ka4...
(4)3Dグラフの作成~
作成したkmlとShapeFileに付属しているdbfを使って3Dグラフを...
国勢調査データから作成したkmlはMultiGeometryタグが無いの...
ここで、表示させるのは人口のデータです。~
library(XML)
library(foreign)
#path<-"/"#Mac
path<-"c:/"
source(paste(path,"kmlFunctions.r",sep=""))
doc <- xmlTreeParse(paste(path,"nahashi/h17ka47201.kml",...
kmlnode<-xmlRoot(doc)
#データの取得
dat<-read.dbf(paste(path,"nahashi/h17ka47201.dbf",sep=""))
data<-dat$JINKO#人口データ指定(ここを変えることで他の項...
Altdata<-data+10#高度:ポリゴンホールが出来ないように全体...
name<-"SEQ_NO2"#マッチング用指定
#色階層の割り当て
cutnum<-16
classes <- cut(data,seq(min(data),max(data),length=cutnu...
cols <- colors.kml(rev(heat.colors(cutnum)))
cols2<-cols[classes]
#kmlへの書き込み
len<-kmlNodeLength(doc)-1
for(i in 1:len){
value<-dat$SEQ_NO2[[i]]#マッチング用指定
print(value)
nodeno<-getCDATANo(kmlnode,name,value)#SEQ_NO2からノード...
#nodeno<-i+1 #こちらを使うとかなり速いです(ノードとDB...
print(nodeno)
fillcolor<-cols2[[i]]
linecolor<-NA
#Macの場合以下のコードで実行可能
#label<-getCDATA(kmlnode,"MOJI",nodeno,cdatano=2)#PlaceM...
#Windowsの場合、いまのところlabelに日本語指定不可
label<-getCDATA(kmlnode,"KEYCODE1",nodeno)
kmlnode<-setAltitude(kmlnode,nodeno,Altdata[[i]],fillcol...
}
#kml保存
saveXML(kmlnode,paste(path,"nahashi/nahashi3.kml",sep=""...
作成には、かなりの時間がかかりますので、気長にお待ちくだ...
ただし、nodeno<-i+1の方を使うとすぐに作成できます。(1分...
データは、nahashi3.kmlで落ちてきます。~
赤くて高い場所ほど人口が多い地域です。那覇港は手作業で着...
#ref(kmlラボ/naha5.JPG,30%)
那覇市の周辺市町村(浦添市、豊見城市、南風原町)を同時に...
明らかに周辺市町村に人口が流れているのがわかる。~
#ref(kmlラボ/city2.JPG,30%)
なお、国勢調査データには利用の制限がありますので、ご注意...
~
利用の制限~
~
1. 利用者は、本システムでダウンロードしたデータ及び画像...
なお、商用目的で複製する場合は、e-Statの「お問い合わせ」...
~
2.法律、政令、規則、省令その他すべての法令及び条例等の...
*MacOSXでrgdalを使えるようにする [#l1ecb7c3]
rgdalパッケージはMacOSXではバイナリで提供されていませんが...
//↓の記事書いたものです.BLOGを移転しましたので,新しいア...
//何か問題があればお手数をおかけしてしまい申し訳ありませ...
//http://www.0093-style.net/0093/2008/02/mac_os_x_leopar_...
http://blog.0093.tv/2008/02/mac-os-x-leopardgrassgdalrgda...
writeOGRもきちんと動きました。(^_^)/~
** MacOS X でrgdalを使えるようにするもうひとつの方法 [#l9...
+[[http://www.kyngchaos.com/software:frameworks]]より、GD...
+ /Library/Frameworks/GDAL.framework/Programs/gdal-confi...
+ rgdalのソースパッケージをCRANから取得
+ $ R32 CMD INSTALL rgdal_0.6-20.tar.gz --configure-args...
*アクセス数: [#tdc929b1]
&counter;
人
終了行:
&color(black,#CCFFCC){LINK:[[[GoogleEarthとR]]][[[ShapeFi...
----
目次
#contents
----
*目的 [#f6347ee0]
rgdalパッケージのwriteOGR関数を使うと、ShapeFileからKMLフ...
そこでXMLパッケージを用いて、作成されたKMLファイルを操作...
注)ここは、「KMLの公開」を目的としたサイトではありません...
*対応表 [#d03e0725]
RとXMLパッケージのバージョンによってはうまく動かないので...
推奨環境:Windows: R2.9.2 - XML1.96~
-Windows: R2.9.2 - XML1.9.6 O
-Windows: R2.7.2 - XML1.94 O (CDATA内部の日本語文字化け...
install.packages("XML", repos = "http://www.omegahat.org/...
-Windows: R2.7.2 - XML1.96 X (CDATA内部の日本語文字化け...
-Windows: R2.6.2 - XML1.94 O~
-MacOSX10.5.5: R2.7.2 O~
~
*関連リンク [#w425a615]
すばらしいサイトです。ここで勉強させてもらってます。~
[[TME:http://thematicmapping.org/]]~
[[EarthAtlas:http://earthatlas.info/?kml=http://www.natur...
*kmlライブラリ [#qca3a38d]
公開データの著作権等について:~
*「地域境界KMLFileデータの作成に当たっては、ESRIジャパン...
*「地域メッシュKMLFileデータの作成にあたっては、財団法人...
|50|150|250|100|300|100|c
|県コード|CENTER:地域名称|CENTER:地域境界KMLFile|CENTER:...
|#|日本全図|#ref(kmlライブラリ/japank.kml)|第1次地域区画...
|#|日本全図||第2次地域区画|#ref(kmlライブラリ/StdMesh02....
|01|北海道|#ref(kmlライブラリ/hokkaido.kml)|1kmメッシュ...
|02|青森県|#ref(kmlライブラリ/aomori.kml)|1kmメッシュ|#...
|03|岩手県|#ref(kmlライブラリ/iwate.kml)|1kmメッシュ|||
|04|宮城県|#ref(kmlライブラリ/miyagi.kml)|1kmメッシュ|||
|05|秋田県|#ref(kmlライブラリ/akita.kml)|1kmメッシュ|||
|10|群馬県|#ref(kmlライブラリ/gunma.kml)||||
**国勢調査のデータのダウンロード [#o3ee385b]
http://www.e-stat.go.jp/SG2/toukeichiri/TopFrame.do?fromP...
*コメント欄 [#w89db461]
#comment(below)
- XML対応表更新 -- [[okinawa]] &new{2009-11-30 (月) 18:21...
- maptoolsにkmlLine,kmlPolygon関数が追加されました。これ...
- さて、そろそろ2次メッシュにいこか・・・。 -- [[okinawa...
- メッシュkmlデータの作成:1次メッシュ生成関数作成終了。 -...
- メッシュkmlデータの作成更新。メッシュを連続生成できるよ...
- メッシュkmlデータの作成を追加。現在、初期段階のコードで...
- GE5向けにkmlFunctions.rを変更しました。今後、ここの内容...
- データを読み込んでkmlを再構成する(2) 那覇市国勢調査...
- 今後、TMEの技術を取り入れていこうと思います。・・・まだ...
- ここの名称を「kmlラボ」に変更しました。 -- [[okinawa]] ...
- kmlFunctions.rバグ修正。 -- [[okinawa]] &new{2008-11-26...
- useInternalNodes = TRUEを使わんといかんのか・・・。utf-...
- 那覇市の周辺市町村(浦添市、豊見城市、南風原町)を同時...
- getCDATA関数復活。これでPlaceMark名にCDATA内の指定デー...
- MacOSXでrgdalを使えるようにするを追加。これでMacでもKML...
- 明日、那覇市長選がある。那覇市国勢調査編として分析した...
- kmlFunctions.rのsetAltitude()にラベルのパラメータ指定を...
- kmlFunctions.rバグ取り&ちょっと修正。 -- [[okinawa]] &...
- データを読み込んでkmlを再構成する(2) 那覇市国勢調査...
- kmlAltitudeNode関数修正、setAltitudeMesh関数をsetAltitu...
- 次はメッシュデータを自動でつくってみます。 -- [[okinawa...
- データを読み込んで、kmlを再構成するを追加。shapefileか...
- kmlFunctions.r追加。 -- [[okinawa]] &new{2008-11-06 (木...
- colors.kml関数追加しました。 -- [[okinawa]] &new{2008-1...
- getKmlNode関数追加。ノードを指定してKMLの切り抜きができ...
- 関数追加。あとは色の変換関数がいるな。 -- [[okinawa]] &...
- 関数を若干修正 -- [[okinawa]] &new{2008-10-23 (木) 08:5...
- 地域メッシュKMLデータの応用追加 -- [[okinawa]] &new{200...
- kmlファイルをRから直接いじってみました。今後は、ライブ...
*kmlデータをXMLパッケージで再構成する関数 [#p7c92b92]
writeOGRで出力されたkmlデータをXMLパッケージを用いて再構...
(構造決めうちなので、[[ShapeFileライブラリ]]のデータをwri...
***kmlFunctions.r [#rb911ac6]
kmlを操作する関数をまとめました。下記のように、適当な場所...
#ref(kmlラボ/kmlFunctions.r)~
古いものは↓
#ref(kmlライブラリ/kmlFunctions.r)~
library(XML) #宣言
source("c:/kmlFunctions.r")#ソースの読み込み
doc <- xmlTreeParse("c:/gunma.kml")#土台となるkmlファイ...
data<-sample(1000:10000,39) #高度データを自動生成
fillcolor<-colors.kml(heat.colors(39),"EE")#色の割り当て...
linecolor<-NA#色の割り当て(線)
x<-kmlAltitudeNode(doc,data,fillcolor,linecolor)#kmlファ...
saveXML(x,"c:/gunma2.kml",prefix = '<?xml version="1.0" ...
~
#ref(kmlライブラリ/color2.JPG,30%)~
***kmlAltitudeNode関数(GE5) [#n3382d3b]
kmlAltitudeNode<-function(doc,data,fillcolor,linecolor,e...
kmlnode <- xmlRoot(doc)
node0<-kmlnode[[1]]
kmlver5<-'http://www.opengis.net/kml/2.2" xmlns:gx="http...
kmlnode<-xmlNode("kml",node0,attrs=c(xmlns=kmlver5))
len1<-length(node0[[1]])
for(i in 2:len1){
if(MG==T){
node1<-node0[[1]][[i]][[2]][[1]]
}else if(MG==F){
node1<-node0[[1]][[i]][[2]]
}
node1<-addChildren(node1,xmlNode("extrude",extrude),xmlN...
node2<-node0[[1]][[i]][[3]][[2]]
node2<-xmlNode("PolyStyle",xmlNode("color",fillcolor[i-1...
#linecolor
node3<-node0[[1]][[i]][[3]][[1]]
node3<-xmlNode("LineStyle",xmlNode("color",linecolor))
#polygon
len2<-length(node0[[1]][[i]][[2]][[1]])
for(j in 1:len2){
x1<-xmlValue(node1[[j]][[1]][[1]])
x2<-rev(unlist(strsplit(x1," ")))
x3<-paste(x2,data[[i-1]],sep=",",collapse=" ")
node1[[j]][[1]][[1]]<-xmlNode("coordinates",x3)
}
#replace node
if(MG==T){
node0[[1]][[i]][[2]][[1]]<-node1
}else if(MG==F){
node0[[1]][[i]][[2]]<-node1
}
node0[[1]][[i]][[3]][[2]]<-node2
node0[[1]][[i]][[3]][[1]]<-node3
kmlnode[[1]]<-node0
}
return(kmlnode)
}
#sample
library(XML)
doc <- xmlTreeParse("c:/gunma.kml")
data<-sample(1000:10000,39)
fillcolor<-c("ff000000","ffff0000","ff00ff00","ff0000ff"...
linecolor<-"NA"
x<-kmlAltitudeNode(doc,data,fillcolor,linecolor)
saveXML(x,"c:/gunma2.kml",prefix = '<?xml version="1.0" ...
#ref(kmlライブラリ/xml1.JPG,30%)~
#ref(kmlラボ/gunma2.kml)~
***setAltitude関数(GE5) [#nb393eab]
ノード番号を指定してピンポイントでAltitudeをセットする。~
setAltitude<-function(kmlnode,nodeno,data,fillcolor,line...
#kmlnode <- xmlRoot(doc)
node0<-kmlnode[[1]]
kmlver5<-'http://www.opengis.net/kml/2.2" xmlns:gx="http...
kmlnode<-xmlNode("kml",node0,attrs=c(xmlns=kmlver5))
if(MG==T){
#altitude
node1<-node0[[1]][[nodeno]][[2]][[1]]
node1<-addChildren(node1,xmlNode("extrude",extrude),xmlN...
#fillcolor
node2<-node0[[1]][[nodeno]][[3]][[2]]
node2<-xmlNode("PolyStyle",xmlNode("color",fillcolor))
#linecolor
node3<-node0[[1]][[nodeno]][[3]][[1]]
node3<-xmlNode("LineStyle",xmlNode("color",linecolor))
#label
node4<-node0[[1]][[nodeno]]
node4<-addChildren(node4,xmlNode("name",label))
#polygon
len2<-length(node0[[1]][[nodeno]][[2]][[1]])
j<-1:len2
text1<-paste('x1<-xmlValue(node1[[',j,']][[1]][[1]]);x2<...
text2<-paste('x3<-paste(x2,data,sep=",",collapse=" ");no...
text<-paste(text1,text2,sep="")
eval(parse(text=text))
node0[[1]][[nodeno]]<-node4
node0[[1]][[nodeno]][[2]][[1]]<-node1
node0[[1]][[nodeno]][[3]][[2]]<-node2
node0[[1]][[nodeno]][[3]][[1]]<-node3
kmlnode[[1]]<-node0
}else if(MG==F){
#altitude
node1<-node0[[1]][[nodeno]][[2]]
node1<-addChildren(node1,xmlNode("extrude",extrude),xmlN...
#fillcolor
node2<-node0[[1]][[nodeno]][[3]][[2]]
node2<-xmlNode("PolyStyle",xmlNode("color",fillcolor))
#linecolor
node3<-node0[[1]][[nodeno]][[3]][[1]]
node3<-xmlNode("LineStyle",xmlNode("color",linecolor))
#label
node4<-node0[[1]][[nodeno]]
node4<-addChildren(node4,xmlNode("name",label))
#polygon
len2<-length(node0[[1]][[nodeno]][[2]][[1]])
j<-1:len2
text1<-paste('x1<-xmlValue(node1[[',j,']][[1]][[1]]);x2<...
text2<-paste('x3<-paste(x2,data,sep=",",collapse=" ");no...
text<-paste(text1,text2,sep="")
eval(parse(text=text))
node0[[1]][[nodeno]]<-node4
node0[[1]][[nodeno]][[2]]<-node1
node0[[1]][[nodeno]][[3]][[2]]<-node2
node0[[1]][[nodeno]][[3]][[1]]<-node3
kmlnode[[1]]<-node0
}
return(kmlnode)
}
getCDATANo関数と組み合わせて必要な場所のみ設定~
#sample
doc <- xmlTreeParse("c:/gunma.kml")
x<-xmlRoot(doc)
#1つめの地域
name<-"JCODE"
value<-"10366"
nodeno<-getCDATANo(x,name,value)
data<-1000
fillcolor<-c("ffff0000")
linecolor<-"ff000000"
x<-setAltitude(x,nodeno,data,fillcolor,linecolor)
#2つめの地域
name<-"JCODE"
value<-"10201"
nodeno<-getCDATANo(x,name,value)
data<-1000
fillcolor<-c("ffff00ff")
linecolor<-"ff000000"
x<-setAltitude(x,nodeno,data,fillcolor,linecolor)
#保存
saveXML(x,"c:/gunma2.kml",prefix = '<?xml version="1.0" ...
#ref(kmlライブラリ/xml4.JPG,30%)~
メッシュのKMLはMultiGeometoryノードが無いので、MGパラメー...
#sample
library(XML)
doc <- xmlTreeParse("c:/StdMesh01.kml")
kmlnode<-xmlRoot(doc)
#1
name<-"CODE"
value<-"3622"
nodeno<-getCDATANo(kmlnode,name,value)
data<-1000000
fillcolor<-c("ffff0000")
linecolor<-"ff000000"
kmlnode<-setAltitude(kmlnode,nodeno,data,fillcolor,linec...
#2
name<-"CODE"
value<-"3623"
nodeno<-getCDATANo(kmlnode,name,value)
data<-800000
fillcolor<-c("ffff00ff")
linecolor<-"ff000000"
kmlnode<-setAltitude(kmlnode,nodeno,data,fillcolor,linec...
#save
saveXML(kmlnode,"c:/StdMesh012.kml",prefix = '<?xml vers...
#ref(kmlライブラリ/color4.JPG,30%)~
***kmlNodeLength関数 [#y7fb430a]
kmlAltitudeNode関数を使うときに、kmlのノード数を知りたい...
#kmlNodeLength() ver 0.1.2
kmlNodeLength<-function(doc){
library(XML)
kmlnode <- xmlRoot(doc)
node0<-kmlnode[[1]]
len1<-length(node0[[1]])
return(len1)
}
#sample
library(XML)
doc <- xmlTreeParse("c:/gunma.kml")
kmlNodeLength(doc)
> #sample
> library(XML)
> doc <- xmlTreeParse("c:/gunma.kml")
> kmlNodeLength(doc)
[1] 40
注)先頭のノードに<name>gunma</name>が入っていますので、...
***getCDATAList関数 [#ic0a4023]
CDATA(HTML)の中身を取り出す。nameに対応する項目名を指定す...
getCDATAList<-function(doc,name){
getCDATA<-function(node,name){
x<-gsub(" ","",iconv(xmlValue(node),"utf-8","cp932"))
x<-unlist(strsplit(x,"<br/>\n"))
x<-x[[grep(name,x)]]
x<-gsub("<b>","",gsub("</b>","",gsub("<i>","",gsub("</i>...
#x<-iconv(x,"","utf-8")
return(x)
}
kmlnode <- xmlRoot(doc)
node0<-kmlnode[[1]]
len1<-length(node0[[1]])
x<-NULL
for(i in 2:len1){
x[i-1]<-getCDATA(node0[[1]][[i]][[1]][[1]],name)
}
return(x)
}
#sample
doc <- xmlTreeParse("c:/gunma.kml")
name<-"CITY1"
getCDATAList(doc,name)
> #sample
> doc <- xmlTreeParse("c:/gunma.kml")
> name<-"CITY1"
> getCDATAList(doc,name)
[1] "前橋市" "高崎市" "桐生市" "伊勢崎市" ...
[11] "安中市" "みどり市" "富士見村" "榛名町" ...
[21] "南牧村" "甘楽町" "中之条町" "長野原町" ...
[31] "川場村" "昭和村" "みなかみ町" "玉村町" ...
> #sample
> doc <- xmlTreeParse("c:/gunma.kml")
> name<-"JCODE"
> getCDATAList(doc,name)
[1] "10201" "10202" "10203" "10204" "10205" "10206" "102...
[18] "10366" "10367" "10382" "10383" "10384" "10421" "10...
[35] "10521" "10522" "10523" "10524" "10525"
***getCDATA関数 [#vf724883]
CDATAのデータを取り出す。cdatanoは、grepで検索した場合、...
getCDATA<-function(kmlnode,name,nodeno=1,sep=":",cdatano...
node0<-kmlnode[[1]]
node1<-node0[[1]][[nodeno]][[1]][[1]]
#x<-gsub(" ","",xmlValue(node1))#mac
x<-gsub(" ","",iconv(xmlValue(node1),"utf-8","cp932"))
#print(x)
x<-unlist(strsplit(x,"<br/>\n"))
xno<-grep(name,x)
len<-length(xno)
if(len>1){
x<-x[[xno[cdatano]]]
}else if(len==1){
x<-x[[xno]]
}
#print(x)
x<-gsub("<b>","",gsub("</b>","",gsub("<i>","",gsub("</i>...
x<-gsub(paste(name,sep,sep=""),"",x)
return(x)
}
> #sample
> doc <- xmlTreeParse("/gunma.kml")
> kmlnode<-xmlRoot(doc)
> name<-"JCODE"
> nodeno<-2
> getCDATA(kmlnode,name,nodeno)
[1] "10201"
***getCDATANo関数 [#x4aa4dac]
nameとvalueを指定することで、CDATA(HTML)内のデータを検索...
#getCDATANo
getCDATANo<-function(kmlnode,name,value){
getCDATA2<-function(node,name){
x<-gsub(" ","",iconv(xmlValue(node),"utf-8","cp932"))
x<-unlist(strsplit(x,"<br/>\n"))
x<-x[[grep(name,x)]]
x<-gsub("<b>","",gsub("</b>","",gsub("<i>","",gsub("</i>...
#x<-iconv(x,"","utf-8")
return(x)
}
#kmlnode <- xmlRoot(doc)
namevalue<-paste(name,":",value,sep="")
node0<-kmlnode[[1]]
len1<-length(node0[[1]])
for(i in 2:len1){
if(namevalue==getCDATA2(node0[[1]][[i]][[1]][[1]],nam...
x<-i
break
}else{
x<-NA
}
}
return(x)
}
#sample
doc <- xmlTreeParse("c:/gunma.kml")
kmlnode<-xmlRoot(doc)
name<-"JCODE"
value<-"10366"
getCDATANo(kmlnode,name,value)
> #sample
> doc <- xmlTreeParse("c:/gunma.kml")
> name<-"JCODE"
> value<-"10366"
> getCDATANo(kmlnode,name,value)
[1] 19
***getKmlNode関数(GE5) [#udad8667]
ノードをnodenoで指定し、指定したノードの部分だけ抽出してK...
#getKmlNode
getKmlNode<-function(kmlnode,nodeno){
len<-length(nodeno)
node0<-kmlnode[[1]]
kmlver5<-'http://www.opengis.net/kml/2.2" xmlns:gx="http...
kmlnode<-xmlNode("kml",node0,attrs=c(xmlns=kmlver5))
node2<-xmlNode("Folder",xmlNode("name",as.character(node...
for(i in 1:len){
node1<-node0[[1]][[nodeno[[i]]]]
node2<-addChildren(node2,node1)
}
kmlnode[[1]][[1]]<-node2
return(kmlnode)
}
#sample
library(XML)
doc <- xmlTreeParse("c:/gunma.kml")
kmlnode<-xmlRoot(doc)
nodeno<-c(2,4,6)
expdata<-getKmlNode(kmlnode,nodeno)
saveXML(expdata,"c:/gunma3.kml",prefix = '<?xml version=...
***colors.kml関数 [#r236dd3e]
colors.kml("色名","アルファチャンネル")
colors.kml<-function(rgb=colors(),alpha="FF"){
colors.hex <- function( x=colors() ) {
color.hex <- function(x) do.call( "rgb", as.lis...
sapply( x, color.hex )
}
col.hex<-colors.hex(rgb)
red<-substr(col.hex,2,3)
green<-substr(col.hex,4,5)
blue<-substr(col.hex,6,7)
alpha<-alpha
col.kml<-paste(alpha,blue,green,red,sep="")
return(col.kml)
}
> colors.kml("red")
[1] "FF0000FF"
> colors.kml(rainbow(10))
[1] "FF0000FF" "FF0099FF" "FF00FFCC" "FF00FF33" "FF66FF...
[10] "FF9900FF"
参考:[[色見本]]~
*メッシュkmlデータの作成 [#t6141a60]
メッシュkmlデータを自動作成します。生成されたkmlはもちろ...
**makeMesh1関数:第1次地域区画(1次メッシュ)生成関数 [...
指定された地域メッシュコードを基に1次メッシュをブロック...
下記のDefaultMesh1.kmlをタネにして作成しますので、ダウン...
#ref(kmlラボ/DefaultMesh1.kml)~
makeMesh1<-function(kmlnode,codea,codeb){
transMeshCode<-function(code){
lat0<-as.integer(substr(code,1,2))/1.5
lon0<-as.integer(substr(code,3,4))+100
lat1<-lat0;lon1<-lon0+1;lat2<-lat0+(2/3);lon2<-lon1
lat3<-lat2;lon3<-lon0
x<-paste(lon0,",",lat0," ",lon1,",",lat1," ",lon2,",",la...
return(x)
}
code1<-as.integer(substr(codea,1,2))
code3<-as.integer(substr(codea,3,4))
code2<-as.integer(substr(codeb,1,2))
code4<-as.integer(substr(codeb,3,4))
print(code1)
print(code2)
print(code3)
print(code4)
node0<-kmlnode[[1]]
node1<-node0[[1]]
node2<-node0[[1]][[2]]
x<<-node0[[1]]
nodex<-removeChildren(x,kids=c("Placemark"))
for(j in code1:code2){
code01<-paste(as.character(j),code3,sep="")
code02<-paste(as.character(j),code4,sep="")
print(j)
for(i in code01:code02){
print(i)
node3<-node0[[1]][[2]][[1]][[1]]
node4<-node0[[1]][[2]][[2]][[1]][[1]][[1]]
CDATA<-paste("<b>CODE:</b><i>",i,"</i><br />\n",sep="")
node3<-xmlCDataNode(CDATA)
node4<-xmlNode("coordinates",transMeshCode(i))
node0[[1]][[2]][[2]][[1]][[1]][[1]]<-node4
node0[[1]][[2]][[1]][[1]]<-node3
node2<-node0[[1]][[2]]
nodex<-addChildren(nodex,node2)
}
node0[[1]]<-nodex
}
kmlnode[[1]]<-node0
return(kmlnode)
}
#Sample
library(XML)
doc <- xmlTreeParse("c:/DefaultMesh1.kml")
kmlnode <- xmlRoot(doc)
kmlnode2<-makeMesh1(kmlnode,3622,3643)#2つの区画を指定す...
saveXML(kmlnode2,"c:/meshdata.kml",prefix = '<?xml versi...
#ref(kmlラボ/mesh2.JPG,30%)~
1次メッシュ生成~
#Sample2:少々時間がかかります
library(XML)
doc <- xmlTreeParse("c:/DefaultMesh1.kml")
kmlnode <- xmlRoot(doc)
kmlnode2<-makeMesh1(kmlnode,3622,6853)
saveXML(kmlnode2,"c:/meshtest.kml",prefix = '<?xml versi...
#ref(kmlラボ/mesh4.JPG,30%)~
*応用編 [#me6a710e]
***データを読み込んでkmlを再構成する(1) [#cce8c1cb]
csvデータを読み込んで、kmlを再構成しています。JCODEでマッ...
#ref(kmlラボ/agedprop.csv)~
library(XML)
source("c:/kmlFunctions.r")
#kmlファイルの読み込み
doc <- xmlTreeParse("c:/gunma.kml")
kmlnode<-xmlRoot(doc)
#csvデータの取得
dat<-read.csv("c:/agedprop.csv")
data<-dat$AP2006
Altdata<-data*1000#高度
name<-"JCODE"#マッチング用指定
#色階層の割り当て
cutnum<-16
classes <- cut(data,seq(min(data),max(data),length=cutnu...
cols <- colors.kml(rev(heat.colors(cutnum)))
cols2<-cols[classes]
#kmlへの書き込み
len<-kmlNodeLength(doc)-1
for(i in 1:len){
value<-dat$JCODE[[i]]
print(value)
nodeno<-getCDATANo(kmlnode,name,value)#JCODEからノードを...
print(nodeno)
fillcolor<-cols2[[i]]
linecolor<-NA
kmlnode<-setAltitude(kmlnode,nodeno,Altdata[[i]],fillcol...
}
#kml保存
saveXML(kmlnode,"c:/gunma2.kml",prefix = '<?xml version=...
#ref(kmlライブラリ/color3.JPG,30%)~
***データを読み込んでkmlを再構成する(2) 那覇市国勢調査...
まず、那覇市国勢調査のデータ(平成17年)を地図で見る統...
http://www.e-stat.go.jp/SG2/toukeichiri/TopFrame.do?fromP...
(1)ダウンロードページ
#ref(kmlライブラリ/naha1.JPG,30%)
(2)世界測地系緯度経度Shape形式を落とします。
#ref(kmlライブラリ/naha2.JPG,30%)
(3)前準備~
落としたShapeFileから、writeOGRでKMLデータ(h17ka47201.km...
library(maptools)
library(rgdal)
x<-readShapePoly("c:/nahashi/h17ka47201.shp")
x@data$KEN_NAME<-iconv(x@data$KEN_NAME,"","utf-8")
x@data$GST_NAME<-iconv(x@data$GST_NAME,"","utf-8")
x@data$MOJI<-iconv(x@data$MOJI,"","utf-8")
tf <- "c:/nahashi/"
writeOGR(x, paste(tf, "h17ka47201.kml", sep=""), "h17ka4...
(4)3Dグラフの作成~
作成したkmlとShapeFileに付属しているdbfを使って3Dグラフを...
国勢調査データから作成したkmlはMultiGeometryタグが無いの...
ここで、表示させるのは人口のデータです。~
library(XML)
library(foreign)
#path<-"/"#Mac
path<-"c:/"
source(paste(path,"kmlFunctions.r",sep=""))
doc <- xmlTreeParse(paste(path,"nahashi/h17ka47201.kml",...
kmlnode<-xmlRoot(doc)
#データの取得
dat<-read.dbf(paste(path,"nahashi/h17ka47201.dbf",sep=""))
data<-dat$JINKO#人口データ指定(ここを変えることで他の項...
Altdata<-data+10#高度:ポリゴンホールが出来ないように全体...
name<-"SEQ_NO2"#マッチング用指定
#色階層の割り当て
cutnum<-16
classes <- cut(data,seq(min(data),max(data),length=cutnu...
cols <- colors.kml(rev(heat.colors(cutnum)))
cols2<-cols[classes]
#kmlへの書き込み
len<-kmlNodeLength(doc)-1
for(i in 1:len){
value<-dat$SEQ_NO2[[i]]#マッチング用指定
print(value)
nodeno<-getCDATANo(kmlnode,name,value)#SEQ_NO2からノード...
#nodeno<-i+1 #こちらを使うとかなり速いです(ノードとDB...
print(nodeno)
fillcolor<-cols2[[i]]
linecolor<-NA
#Macの場合以下のコードで実行可能
#label<-getCDATA(kmlnode,"MOJI",nodeno,cdatano=2)#PlaceM...
#Windowsの場合、いまのところlabelに日本語指定不可
label<-getCDATA(kmlnode,"KEYCODE1",nodeno)
kmlnode<-setAltitude(kmlnode,nodeno,Altdata[[i]],fillcol...
}
#kml保存
saveXML(kmlnode,paste(path,"nahashi/nahashi3.kml",sep=""...
作成には、かなりの時間がかかりますので、気長にお待ちくだ...
ただし、nodeno<-i+1の方を使うとすぐに作成できます。(1分...
データは、nahashi3.kmlで落ちてきます。~
赤くて高い場所ほど人口が多い地域です。那覇港は手作業で着...
#ref(kmlラボ/naha5.JPG,30%)
那覇市の周辺市町村(浦添市、豊見城市、南風原町)を同時に...
明らかに周辺市町村に人口が流れているのがわかる。~
#ref(kmlラボ/city2.JPG,30%)
なお、国勢調査データには利用の制限がありますので、ご注意...
~
利用の制限~
~
1. 利用者は、本システムでダウンロードしたデータ及び画像...
なお、商用目的で複製する場合は、e-Statの「お問い合わせ」...
~
2.法律、政令、規則、省令その他すべての法令及び条例等の...
*MacOSXでrgdalを使えるようにする [#l1ecb7c3]
rgdalパッケージはMacOSXではバイナリで提供されていませんが...
//↓の記事書いたものです.BLOGを移転しましたので,新しいア...
//何か問題があればお手数をおかけしてしまい申し訳ありませ...
//http://www.0093-style.net/0093/2008/02/mac_os_x_leopar_...
http://blog.0093.tv/2008/02/mac-os-x-leopardgrassgdalrgda...
writeOGRもきちんと動きました。(^_^)/~
** MacOS X でrgdalを使えるようにするもうひとつの方法 [#l9...
+[[http://www.kyngchaos.com/software:frameworks]]より、GD...
+ /Library/Frameworks/GDAL.framework/Programs/gdal-confi...
+ rgdalのソースパッケージをCRANから取得
+ $ R32 CMD INSTALL rgdal_0.6-20.tar.gz --configure-args...
*アクセス数: [#tdc929b1]
&counter;
人
ページ名: