2

kmlファイルを生成するpythonスクリプトがあります。ここで、この kml ファイルをスクリプト内で (手ごとではなく) Google マップの「マイ マップ」セクションにアップロードしたいと考えています。そうするためのpythonまたは他のスクリプト/コードを持っている人はいますか?

4

1 に答える 1

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 に修正してほしい場合は、投票してコメントしてください。

それまでの間、そのバグが修正されていない場合は、試すことができます

  1. KML をアップロードせずにマップを作成し、バグが存在することが確認されたときに、Google からの問題に関するコメント #9 で提案されているように、KML フィーチャを適切にアップロードします。
  2. KML の代わりにXML をアップロードするCSVをアップロードする (これらの方法が必要な処理をサポートしている場合)
  3. KML データの形式をいじる。API に関する Google グループのこの投稿は、これが役立つ可能性があることを示唆していますが、複雑に見えます。

幸運を

于 2010-09-28T20:12:33.960 に答える