Edited at

地理データのKMLファイルをRubyでTSVに変換する

More than 3 years have passed since last update.

GoogleEarthProから書き出したKMLファイルを、取り扱いやすいTSV形式に変換するサンプルです。


Rubyコード

require 'nokogiri'

fields = [:place, :lat, :lon]
print fields.join("\t") + "\n"

kml_file = 'export.kml'
@doc = Nokogiri::XML(File.open(kml_file))
@doc.css('Placemark').each do |placemark|
name = placemark.css('SimpleData')
coordinates = placemark.at_css('coordinates')
lat,lon = coordinates.text.split(',')
print [name.text, lat, lon].join("\t") + "\n"
end


実行結果

$ ruby kml2csv.rb

place lat lon
東京都豊島区池袋*丁目*-*-* 139.***0003 35.***36150000002
東京都板橋区板橋2-*-* 139.***2622 35.***8046
東京都板橋区中丸町** 139.***2803999999 35.***14079999998


サンプルファイル

今回の対象ファイルのXML構造は次の通りです。

次のような<Placemark>の中に元の住所と結果の緯度経度が納められています。

なお、一部*で伏せておりますがご了承ください。

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">

...snip...

<Folder id="layer 0">
<name>test</name>
<visibility>0</visibility>
<Placemark>
<visibility>0</visibility>
<styleUrl>#pointStyleMap</styleUrl>
<Style id="inline">
<IconStyle>
<color>ffe8e8e8</color>
<colorMode>normal</colorMode>
<Icon>
<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
</Icon>
</IconStyle>
<LineStyle>
<color>ffe8e8e8</color>
<colorMode>normal</colorMode>
</LineStyle>
<PolyStyle>
<color>ffe8e8e8</color>
<colorMode>normal</colorMode>
</PolyStyle>
</Style>
<ExtendedData>
<SchemaData schemaUrl="#S_test_S">
<SimpleData name="address">東京都豊島区池袋*丁目*-*-*</SimpleData>
</SchemaData>
</ExtendedData>
<Point>
<coordinates>139.***0003,35.*****150000002,0</coordinates>
</Point>
</Placemark>

...snip...


参考サイト

http://stackoverflow.com/questions/14209033/ruby-nokogiri-converting-kml-to-csv