【KML】PythonでKMLをいじれるようにする。飲食店マップのレイヤーわけ【Map】

お問い合わせ(笑)

小平飲食店MAPで今の所左側の「レイヤ」ってとこですか?は登録順になってまして、自分用に勝手に業種別色分けにしてますが、作り直しではなく何かの技???で業種別の並び方への変更などは可能ですか?

何か技を使わなければ、いちいち、GoogleMapで入れ直しをしていかないといけない。

これめんどくさいし、なかなか積極的な 「こだいら CivicTech」 になってきてますので、こういうことを簡単にできるようにするには・・・と考えてみました。

まずは、KMLファイルを解析

KMLファイルを除いてみると・・・

飲食店マップには、<Folder><name>色別登録</name> 中身のデータ </Folder> という組み合わせが、1つ。ほかのレイヤー分けされたKMLファイルをみると、これがいくつかに分かれています。

構造として

<Folder>
 <name>色別登録</name>
 <Placemark>
    それぞれのデータ
 </Placemark>
  <Placemark>
    それぞれのデータ
 </Placemark>
</Folder>

というような構造になっています。

それで、このデータの中に、業種別になっているものを探してみると、色別登録されていることから、<styleUrl>というタグに囲まれているところが、それぞれあることがわかりました。

<styleUrl>#icon-1899-FFD600</styleUrl>

たぶんマーカーの色を指定しているものですね。これをKeyにして、Folderをわけていくと良さそうです。

さて、KMLを簡単に編集できるエディターが。。。 ないんですよね。それで

FusionTableに一回入れて編集してみる。

Google FusionTableというマップ用のDBがあります。これも便利なんですが、こやつマーカーのスタイルを消して読み込みするようで、使えない(涙)

エディタで眺めていたら。。Pythonでやるか?って

KMLをいじれるライブラリに、FastKMLとかあったり、XMLをいじれるxml.etree.ElementTree などがあります。これらは、パーサーといって便利にいじれるはずなんですが。。おじさん。。使ったことないので、わからない(笑)

少しいじってみたけど、やりたいようにデータをいじれないので・・

まずは、何種類あるんだろう? ってPython で読んでみました。

myfile= open("C:\\Users\\tom2r\\Downloads\\最新飲食店マップ.kml", 'r', encoding="utf-8")
lines2 = myfile.readlines() 
myfile.close()
i=0
styleurl=[]
for i in range(0,len(lines2)):
 if lines2[i].find('<Placemark>')>0:
  while lines2[i].find("</Placemark>")<0:
  i=i+1
   if lines2[i].find("styleUrl")>0:
    styleurltemp=lines2[i]
   if styleurl==[]:
    styleurl.append(styleurltemp)
    if styleurltemp not in styleurl :
      styleurl.append(styleurltemp)
print(len(styleurl))
styleurl

一行づつ読んで、<Placemark>と</Placemark>に囲まれたところにあるstyleUrlをとってきて、それを配列い入れて、同じものがなければ、新しく配列に追加していくというプログラムです。最後に何種類あるのか?と、全種類を出力しています。

15
['        <styleUrl>#icon-1899-FFD600</styleUrl>\n',
 '        <styleUrl>#icon-1899-FF5252</styleUrl>\n',
 '        <styleUrl>#icon-1899-0288D1</styleUrl>\n',
 '        <styleUrl>#icon-1899-7CB342</styleUrl>\n',
 '        <styleUrl>#icon-1899-880E4F</styleUrl>\n',
 '        <styleUrl>#icon-1899-9C27B0</styleUrl>\n',
 '        <styleUrl>#icon-1899-AFB42B</styleUrl>\n',
 '        <styleUrl>#icon-1899-FFEA00</styleUrl>\n',
 '        <styleUrl>#icon-1899-E65100</styleUrl>\n',
 '        <styleUrl>#icon-1899-558B2F</styleUrl>\n',
 '        <styleUrl>#icon-1899-006064</styleUrl>\n',
 '        <styleUrl>#icon-1899-BDBDBD</styleUrl>\n',
 '        <styleUrl>#icon-1899-097138</styleUrl>\n',
 '        <styleUrl>#icon-1899-A52714</styleUrl>\n',
 '        <styleUrl>#icon-1899-C2185B</styleUrl>\n']

ということで、種類わけするKeyが見つかりました。
今度は、この#icon-1899-なんちゃら っていう数字別にPlacemarkを並び変えるといいということですね。

で・・・一行づつみると、大変だわ。。ってことで、今度は、元のKmlファイルの<Placemark> から</Placemark> までを一行にしてみました。

ぼくはTerapadというエディタで、改行を一度全部とり、</Placemark>を</Placemark>+改行に全置換しました。

そのファイルを、今度は、一行づつ見て、上のstyleUrlごとに、<Folder>をわけて書き込めばよいことになります。

で。。今度は、こんなスクリプトを書いてみました。

styleurl=['<styleUrl>#icon-1899-FFD600</styleUrl>',
 '<styleUrl>#icon-1899-FF5252</styleUrl>',
 '<styleUrl>#icon-1899-0288D1</styleUrl>',
 '<styleUrl>#icon-1899-7CB342</styleUrl>',
 '<styleUrl>#icon-1899-880E4F</styleUrl>',
 '<styleUrl>#icon-1899-9C27B0</styleUrl>',
 '<styleUrl>#icon-1899-AFB42B</styleUrl>',
 '<styleUrl>#icon-1899-FFEA00</styleUrl>',
 '<styleUrl>#icon-1899-E65100</styleUrl>',
 '<styleUrl>#icon-1899-558B2F</styleUrl>',
 '<styleUrl>#icon-1899-006064</styleUrl>',
 '<styleUrl>#icon-1899-BDBDBD</styleUrl>',
 '<styleUrl>#icon-1899-097138</styleUrl>',
 '<styleUrl>#icon-1899-A52714</styleUrl>',
 '<styleUrl>#icon-1899-C2185B</styleUrl>']

myfile= open("C:\\Users\\tom2r\\OneDrive\\デスクトップ\\insyoku.txt", 'r', encoding="utf-8")
lines2 = myfile.readlines() 
myfile.close()
catline=[]
for i in range(0,len(lines2)):
 for j in range(0,len(styleurl)):
  if lines2[i].find(styleurl[j])>0:
   catline.append(j)
 
for j in range(0,14): 
 firstflg=0
 for i in range(0,len(lines2)):
  if catline[i]==j:
   if firstflg==0:
    print('<Folder><name>',j,'</name>')
    firstflg=firstflg+1
   print(lines2[i])
 print('</Folder>')

何をやってるかというと。。

一行づつ、styleUrlをみて、同じのがあれば、それをCatlineというリストに番号として入れていきます。

それから、ラインをみて、catlineの数字毎(styleurl)ごとに出力しました。

これを、最初のKMLのStyleの部分と合体させて、読み込ませれば・・・

うぉ~Google Mapはレイヤー10個までだった(笑)

で、読み込ませてみたら。。 あはは・・レイヤー10個までしかだめだった(笑)

120件分のデータが、15個のレイヤー(Folder)に分かれてしまったので、しかたなく

10個までと、11個以降の二つの地図にとりあえず分けておきました。

とりあえず、カテゴリーを10個以内にしてもらわなくては入らないですねぇ~(笑)

元の地図で、マーカーの色を10色までにしてもらうか?

この地図で、8個と2個くらいに一回して、KMLでダウンロードして、ひとつの地図にするか?

やっぱり、Scriptつくっておいてよかった。またもう一回する時は、ここを見ながらできます(笑)