パーソナルツール
現在の場所: ホーム misc map2earth.py
書いた本
Plone 完全活用ガイド の Chapter 1, 2, 3, 11 を執筆しました。
plone のインストール、使い方から、機能・デザインのカスタマイズ、プロダクトの作り方まで、 plone のすべてがぎゅっと詰まっている書籍になっていると思います。
plone に興味がある人から、すでに使いこなしている方まで、ぜひ読んでみてください。
Plone 完全活用ガイドのサポートページ
ナビゲーション

 
文書操作

map2earth.py

作成者 takanori 最終変更日時 2008年06月04日 12時42分

Yahoo!地図情報等から Google Earth に場所を表示させるための kml を出力する Python Script のソース

Click here to get the file

サイズ 3.4 kB - File type text/python-source

ファイルのコンテンツ

# Yahoo!地図情報 から住所の情報を取得する
# この関数を使用するためには、httplib, re が使用できる必要があります
from httplib import HTTPConnection
import re

def get_name(nl, el):
    path = "/pl?nl=%s&el=%s&la=1&fi=1&sc=2" % (nl, el)
    name = ""
    try:
        conn = HTTPConnection("map.yahoo.co.jp")
        conn.request("GET", path)
        res = conn.getresponse()
        map_html = unicode(res.read(), 'japanese.euc_jp').encode('utf8')
        pattern = re.compile("<title>Yahoo!地図情報 - (.*)の周辺地図</title>")
        m = pattern.search(map_html)
        if m:
            name = m.group(1)
    except:
        pass
    return name

# 緯度経度の表記を度分秒から10進に変換する
def min2dec(org):
    (deg, min, sec) = org.split(".", 2)
    dec = (float(deg) + float(min) / 60.0 + float(sec) / 3600.0)
    return dec

def error(url):
    string = """<html>
<head><title>URL が正しくありません</title></head>
<body>
<p>
入力した URL が正しくないため、地図情報の取得に失敗しました。<br />
入力された URL は以下のとおりです。<br />
<a href="%s">%s</a>
</p>
以下のいずれかの地図サイトから Bookmarklet を実行してください。
<ul>
<li><a href="http://map.yahoo.co.jp/">Yahoo!地図情報</a>
<li><a href="http://www.mapfan.com/">MapFan Web</a>
<li><a href="http://map.goo.ne.jp/">goo 地図</a>
<li><a href="http://map.livedoor.com/">livedoor 地図</a>
</ul>
</body>
</html>""" % (url, url)
    return string

# Import a standard function, and get the HTML request and response objects.
from Products.PythonScripts.standard import html_quote
request = container.REQUEST
RESPONSE =  request.RESPONSE

# parse url string
urlpattern = re.compile("http://(map.yahoo.co.jp|map.msn.co.jp|map.goo.ne.jp|map.livedoor.com||www.mapfan.com)/.*\?")
if urlpattern.search(request.url) == None:
    print error(request.url)
    return printed

(path, query_string) = request.url.split('?')
query = {}
for str in query_string.split('&'):
    (key, value) = str.split('=')
    query[key] =value

name = ""
el = ""
nl = ""

if path.startswith("http://map.yahoo.co.jp"):
    el = query['el']
    nl = query['nl']
elif path.startswith("http://map.msn.co.jp"):
    el = query['la']
    nl = query['lg']
elif path.startswith("http://map.goo.ne.jp") or path.startswith("http://map.livedoor.com") or path.startswith("http://www.mapfan.com/"):
    map = query['MAP']
    pos_e = map.find("E")
    pos_n = map.find("N")
    el = map[pos_e + 1:pos_n]
    nl = map[pos_n + 1:]
else:
    print error(request.url)
    return printed

if len(nl) > 0 and len(el) > 0:
    name = get_name(nl, el)
    b_tokyo = min2dec(nl)
    l_tokyo = min2dec(el)

# 日本測地系から WGS 84 に変換する
b_wgs84 = b_tokyo - 0.00010695 * b_tokyo + 0.000017464 * l_tokyo + 0.0046017
l_wgs84 = l_tokyo - 0.000046038 * b_tokyo - 0.000083043 * l_tokyo + 0.010040

RESPONSE.setHeader("Content-Type", "application/vnd.google-earth.kml+xml")

print '''<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Placemark>
  <name>%s</name>
  <View>
    <longitude>%s</longitude>
    <latitude>%s</latitude>
    <range>1000</range>
</View>
</Placemark>
</kml>
''' % (name, l_wgs84, b_wgs84)

return printed

Powered by vine linux, python, zope, plone, coreblog