Hatena::ブログ(Diary)

自然環境保全のための周辺技術

2009-10-24

Google マイマップのデータをKMLにエクスポートしてCSVに変換する方法

20:42 | Google マイマップのデータをKMLにエクスポートしてCSVに変換する方法を含むブックマーク

「google earthで表示」を右クリックしてリンクアドレスをコピーして、そのURLの中の「output=nl」を「output=kml」に変更してアクセスするとkmlファイルがダウンロードされます。↓のプログラムをkml2csv.jsという名前で保存して、それに↑のKMLファイルをドラッグ&ドロップしてください。同名のCSVファイルに変換されます。

※「google earthで表示」を押してダウンロードされるKMLでは、変換できません。

※jsファイルが関連付けされてないと、実行できないかもしれません。

※変換できない場合があったので修正しました。2010.1.17

var input;
var output;

input = WScript.Arguments(0);
output=input.replace(".kml",".csv");
var fs = new ActiveXObject ("Scripting.FileSystemObject");
var outf = fs.CreateTextFile (output, true); 
var xmlDoc = WScript.CreateObject("MSXML.DOMDocument"); 
xmlDoc.load(input); 

var wpts = xmlDoc.documentElement.getElementsByTagName("Placemark");
outf.WriteLine("lat,lon,name,snippet,description");
for(var i = 0; i<wpts.length;i++){
 var names = wpts[i].getElementsByTagName("name");
 if(names.length>0 && !!names[0].childNodes[0]) var name = names[0].childNodes[0].text;
 var snippets = wpts[i].getElementsByTagName("Snippet");
 if(snippets.length>0 && !!snippets[0].childNodes[0]) var snippet = snippets[0].childNodes[0].text;
 var descriptions = wpts[i].getElementsByTagName("description");  
 if(descriptions.length>0 && !!descriptions[0].childNodes[0]) var description = descriptions[0].childNodes[0].text;
 // descriptionのタグを消したい時は、こちら↓
 // if(descriptions.length>0 && !!descriptions[0].childNodes[0]) var description = descriptions[0].childNodes[0].text.replace(/\r?\n/g, "").replace(/,/g," ").replace(/<("[^"]*"|'[^']*'|[^'">])*>/g," ");
 var points = wpts[i].getElementsByTagName("Point");
 if(points.length>0 && !!points[0].childNodes[0]) var point = points[0].childNodes[0].text.split(",");
 outf.WriteLine(point[1]+","+point[0]+","+name+","+snippet+","+description);
    
 }//for i

outf.Close();

加藤加藤 2010/01/16 00:57 お忙しい中恐れ入ります。知識がない私のようなものにとってありがたいページで感謝しております。ちょっとした質問があります。もしお閑でしたら回答ください。

AG2KMLのようにCSVファイルからKMLファイルに変換してくれるようなソフトがあって地図の作成が超楽になりました。しかしデータがあると便利なのですが、既にアップロードした地図(すでに緯度経度などの情報を捨ててしまった地図など)に関して修正ができないのが残念です。つまり
1、KMLファイルを読み込んでCSVファイルで出力
2、Excel等で編集
3、KMLファイルに再変換して保存
の1ができないのが残念です。以前は一つ一つマークをマップ上で追加し地図を作成していました。でもこのような地図は拡大すると位置がづれてしまいます。この緯度経度についてだけ修正できれば全く問題ない(一から新しい地図をつくるのが面倒、、、)ので再利用したいのですが、上記の1の部分ができないので(1つ1つGoogle Map上で編集するのも面倒ですし)悩んでおりました。

そんなときこちらのページにたどりついたわけです。何とかKMLファイルをDLしkml2csv.jsにドラックドロップしてCSVファイルに変換すことができましたが、このファイルをExcelで開いたところ、全てのマーカー(項目)のLon(緯度)がundefined、Lat(経度)が#styleXXX(XXXは2桁あるいは3桁の適当で異なった数字)となります。説明部分も消えてしまいます。というかkml2csv.jsにドラックドロップする際以下のようなエラーがでます。
行  27
文字 3
エラー プロシージャの呼び出し、または引数が不正です。
コード 800A0005

こちらが間違えているかもしれないので、アドバイスいただけると幸いです。

tmizu23tmizu23 2010/01/16 13:20 ご質問ありがとうございます。
プログラムにバグがあるのかもしれません。(手元のデータでは、大丈夫だったのですが、ほかのKMLの構成だと、ダメだったのでしょう。)
もし、よろしければ、そのエラーの出るKMLファイルを、どこかにアップしてもらえれば、
確認してみますよ。

加藤加藤 2010/01/17 00:48 金曜日の忙しいときにわざわざ付き合っていただき恐れ入ります。

早速ですが、上記のURLにファイルをアップしました。ファイルは4つです。
いい方法が思いつかず、このような方法になりました。
できましたら長時間アクセスできる状態は避けたいので、ファイル受け取りになられたら「受け取った」と一言ください。

・日本二百名山.kml.txt
h**p://docs.google.com/Doc?docid=0AWXQHr988CJfZGc3ZGRrdGtfMjJoY3NrbWhkOQ&hl=en

・日本二百名山.csv
http://spreadsheets.google.com/ccc?key=0AmXQHr988CJfdDZHc0IwTGZ5cHVxLVB6VC1uVmt2ZVE&hl=en

・日本百名山.csv
http://spreadsheets.google.com/ccc?key=0AmXQHr988CJfdGxwdEV3YlhoU0hk

・日本百名山.kmz.txt
http://docs.google.com/Doc?docid=0AWXQHr988CJfZGc3ZGRrdGtfMjFoZ2d3cDY4Zg&hl=en

KMLファイルはマイマップの地図をoutput=kmlでDLしました。GoogleドキュメントではKMLファイルをアップできないので.txtを付けています。CSVファイルはkml2csv.jsにドロップして出力されたファイルです。
5ケ以上のURLがあると投稿できないみたいなのでh**pにしてあります。

緯度経度のデータがなくなっています。多分アイコンを以下のように指定しているせいかもしれません。Googleマップで用意されているアイコンを使用すれば問題ないのかな。素人考えですが、、、

<Style id="styleXX">
<IconStyle>
<Icon>
<href>http://XXXXXXXXXXXXXXXXXXXXXXXXX.gif</href>
</Icon>
</IconStyle>
</Style>

また、説明欄にHTMLで記述したこと(具体的には写真関係の記述)はdescriptionの欄に出力されないのでしょうか。KMLファイルを開くとdescriptionタグにそれらしき文字列は出力されていますが、CSVファイルに出力すると全くなくなっています。

tmizu23tmizu23 2010/01/17 10:09 ファイル受け取りました。プログラムも修正しました。
原因は、こちらで試したkmlには、snippetというタグが存在していなかったので、それを考慮していませんでした。
descriptionのタグも出力するようにしました。タグなしで、テキスト部分だけ出力したい場合は、//でコメントアウトしてある部分の//を消してください。

加藤加藤 2010/01/17 10:35 お休みなところ貴重なお時間を割いて申し訳ありませんでした。

知識があるって素晴らしいですね。早速使用させていただきます。
何も恩返しできませんが、せめて言葉だけでも持ち上げさせていただき感謝のしるしとしたいです。ありがとうございました。

よっ! 大統領!! 日本一!!

加藤加藤 2010/01/22 23:42 いやはやなんと申してよいやら、、、
またまた金曜日にお邪魔して申し訳ないです。
先週のファイル、日本百名山の方は大丈夫だったのですが、二百名山の方が、上記と同じアラート(行は24、文字は2に変化)が出てしまいます。

お手すきで構いませんので何卒よろしくお願いします。
http://docs.google.com/leaf?id=0B2XQHr988CJfNTJiYzFiMTAtYThhYy00N2IzLTkzNGYtZGU0MTNlOGJhNWVk&hl=en

tmizu23tmizu23 2010/01/23 11:39 132番のえぶりさしだけ の漢字がプログラムに対応していないので、エラーになるようです。
そこを一時的に変更しておけば、大丈夫です。

あと、kmlファイルをEXCELで「読み取り専用のブックで開く」で開いて編集してCSVで保存すれば、この方法でなくても変換できることに気がつきました。

加藤加藤 2010/01/23 22:26 かさねがさねありがとうございました。

よっ!色男っ!!

おすぎおすぎ 2010/04/04 18:19 すみません。こちらもうまくいきません。エラーが出てしまいます。

---------------------------
Windows Script Host
---------------------------
スクリプト: E:\kml2csv.js
行: 24
文字: 2
エラー: プロシージャの呼び出し、または引数が不正です。
コード: 800A0005
ソース: Microsoft JScript 実行時エラー

---------------------------
OK
---------------------------

と言うエラーメッセです。

すみませんがご確認お願いします。

tmizu23tmizu23 2010/04/05 13:07 データをどこかにアップして頂ければ、確認してみますが。

長尾長尾 2011/11/01 17:34 はじめて質問させていただきます。
.kml ファイルを入手したのですが、データを.csvとしてみたいと思い、このサイトにたどり着きました。
.kmlをkml2csv.jsにドラッグアンドドロップすると、以下のエラーが表示されます。
----------------------
行11
文字1
エラー xmlDoc.documentElementはNullまたはオブジェクトがありません。
コード:800A138F
ソース:Microsoft JScript実行時エラー
----------------------
パソコンの環境設定の問題のような気もしますが、どう対処すればよろしいでしょうか。
Windows 7を使っております。

ご指導のほどよろしくお願いいたします。

長尾吉郎

tmizu23tmizu23 2011/11/11 11:20 ご利用ありがとうございます。
プログラムを公開してから、時間がたっているので、まだこれが動作するのか
分かりませんが、もし、変換が必要でしたら、どこかにkmlをアップください。
こちらで検証してみたいと思います。