Google mapをローカルでPOI-CSV変換する方法

webサービスGoogleマップ POI・CSVコンバーターというのがあるので、それを使うと便利ですよ。

ですが、

  • なぜか文字がエスケープ化してしまい、困った←自分です。
  • 予期せぬURL流出は、ちとマズい

という人は、メリットあるかも。

以下、お手製XSLファイルを用い、ローカルPC上で、マイマップRSSからPOI用CSVを作成します。

方法

1.google mapsRSSをダウンロードする

希望するマイマップを選択した状態でRSSをSaveTargetAsで保存。ファイル名拡張子は、一応"〜.xml"で。

2.ダウンロードしたRSSファイルに以下一文(★行)を加える
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="gmap.xsl"?>  ←★コレです
<rss version="2.0" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
<channel>
...
</channel>
</rss>
3.RSSと同じディレクトリに、後述のgmap.xslを置く
4.firefoxで開く

2で編集したRSSファイルを、firefox画面にドラッグ&ドロップすれば開かれます。
IEで開くと、何故かxslがAccessDeniedになってしまいます。何故?

5.表示内容を全選択し、エディタ等にコピペ。CSVとして保存。

ブラウザのSaveAsで保存すると、勝手に改行が入る事があり、都合悪いです。
エディタでの保存は、普通に(Shift-JISで)保存して下さい。

6.POI-Loaderでアップロード

gmap.xsl

エディタ等でUTF-8で gmap.xslという名前で保存して下さい。
notepadでの保存例→

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:georss="http://www.georss.org/georss"
	>
<xsl:output method="html" encoding="Shift_JIS" />

<xsl:template match="/">
	<xsl:apply-templates />
</xsl:template>

<xsl:template match="link" />
<xsl:template match="title" />
<xsl:template match="description" />

<xsl:template match="item">
	<xsl:variable name="loc"><xsl:value-of select="normalize-space(georss:point)" /></xsl:variable>
	<xsl:variable name="desc1"><xsl:value-of select="substring-before(substring-after(description, '&lt;div dir=&quot;ltr&quot;&gt;'),'&lt;/div&gt;')" /></xsl:variable>
	<xsl:variable name="desc2">
		<xsl:call-template name="restr">
			<xsl:with-param name="str" select="$desc1" />
		</xsl:call-template>
	</xsl:variable>
	<xsl:variable name="desc">
		<xsl:call-template name="crlf">
			<xsl:with-param name="str" select="$desc2" />
		</xsl:call-template>
	</xsl:variable>
	<xsl:value-of select="substring-after($loc, ' ')" />,<!--
	--><xsl:value-of select="substring-before($loc, ' ')" />,<!--
	--><xsl:value-of select="title" />,<!--
	-->&quot;<xsl:copy-of select="$desc" />&quot;<br/>
</xsl:template>

<xsl:template name="restr">
	<xsl:param name="str"/>
	<xsl:value-of select="translate($str, 
		'0123456789−#*ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 
		'0123456789-#*ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')" 
	/>
</xsl:template>

<xsl:template name="crlf">
<xsl:param name="str"/>
<xsl:variable name="match">&lt;br&gt;</xsl:variable>
<xsl:choose>
	<xsl:when test="contains($str,$match)"
	><xsl:value-of select="substring-before($str,$match)"
	/><br
		/><xsl:call-template name="crlf">
			<xsl:with-param name="str" select="substring-after($str,$match)"/>
			<xsl:with-param name="match" select="$match"/>
		</xsl:call-template></xsl:when>
	<xsl:otherwise><xsl:value-of select="$str"/></xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet> 
  • RSSのコメント欄は、プレーンテキストしか想定していません。
  • コメントの全角英数を半角に変換しています。

備考