kmlファイルを生成するpythonスクリプトがあります。ここで、この kml ファイルをスクリプト内で (手ごとではなく) Google マップの「マイ マップ」セクションにアップロードしたいと考えています。そうするためのpythonまたは他のスクリプト/コードを持っている人はいますか?
1 に答える
概要:問題 2590が修正されるまではできません。Google がこの問題を WontFix としてクローズしているため、しばらく時間がかかる可能性があります。同じ最終結果を得るために試行できる回避策がありますが、現状では、Google Maps Data API を使用して KML ファイルを単純にアップロードすることはできません。
長いバージョン:
これを行うための Python コードはありませんでしたが、Google Maps Data APIを使用すると、一連の HTTP リクエストでこれを行うことができます。これを行う方法に関するドキュメントについては、開発者ガイドの HTTP プロトコル セクションのKML のアップロードを参照してください。したがって、考えられる Python の解決策の 1 つは、標準ライブラリのhttplibのようなものを使用して、適切な HTTP 要求を行うことです。
さまざまな編集とコメントへのフィードバックの後、コマンド ライン経由で Google のユーザー名とパスワードを受け取り (使用方法に注意してください) 、 ClientLogin 認証リクエストauthorization_token
を作成して変数を取得するスクリプトを次に示します。有効なユーザー名とパスワードがあれば、認証トークンをヘッダーで使用して、KML データを Maps Data API に POST できます。Authorization
#!/usr/bin/env python
import httplib
import optparse
import sys
import urllib
class GoogleMaps(object):
source = "daybarr.com-kmluploader-0.1"
def __init__(self, email, passwd):
self.email = email
self.passwd = passwd
self._conn = None
self._auth_token = None
def _get_connection(self):
if not self._auth_token:
conn = httplib.HTTPSConnection("www.google.com")
params = urllib.urlencode({
"accountType": "HOSTED_OR_GOOGLE",
"Email": self.email,
"Passwd": self.passwd,
"service": "local",
"source": self.source,
})
headers = {
"Content-type": "application/x-www-form-urlencoded",
"Accept": "text/plain",
}
conn.request("POST", "/accounts/ClientLogin", params, headers)
response = conn.getresponse()
if response.status != 200:
raise Exception("Failed to login: %s %s" % (
response.status,
response.reason))
body = response.read()
for line in body.splitlines():
if line.startswith("Auth="):
self._auth_token = line[5:]
break
if not self._auth_token:
raise Exception("Cannot find auth token in response %s" % body)
if not self._conn:
self._conn = httplib.HTTPConnection("maps.google.com")
return self._conn
connection = property(_get_connection)
def upload(self, kml_data):
conn = self.connection
headers = {
"GData-Version": "2.0",
"Authorization": 'GoogleLogin auth=%s' % (self._auth_token,),
"Content-Type": "application/vnd.google-earth.kml+xml",
}
conn.request("POST", "/maps/feeds/maps/default/full", kml_data, headers)
response = conn.getresponse()
if response.status != 200:
raise Exception("Failed to upload kml: %s %s" % (
response.status,
response.reason))
return response.read()
if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("-e", "--email", help="Email address for login")
parser.add_option("-p", "--passwd", help="Password for login")
options, args = parser.parse_args()
if not (options.email and options.passwd):
parser.error("email and passwd required")
if args:
kml_file = open(args[0], "r")
else:
kml_file = sys.stdin
maps = GoogleMaps(options.email, options.passwd)
print maps.upload(kml_file.read())
残念ながら、有効なログイン資格情報を使用して有効な認証トークンを取得し、ドキュメントに記載されている例を正確に含む有効な KML ファイルを使用しても、API は400 Bad Request
. どうやらこれは既知の問題 ( 2010 年 7 月 22 日に報告された2590 ) であるため、Google に修正してほしい場合は、投票してコメントしてください。
それまでの間、そのバグが修正されていない場合は、試すことができます
- KML をアップロードせずにマップを作成し、バグが存在することが確認されたときに、Google からの問題に関するコメント #9 で提案されているように、KML フィーチャを適切にアップロードします。
- KML の代わりにXML をアップロードするかCSVをアップロードする (これらの方法が必要な処理をサポートしている場合)
- KML データの形式をいじる。API に関する Google グループのこの投稿は、これが役立つ可能性があることを示唆していますが、複雑に見えます。
幸運を