как я могу загрузить файл kml со скриптом на карты Google? - PullRequest
1 голос
/ 28 сентября 2010

У меня есть скрипт на python, который генерирует файлы kml. Теперь я хочу загрузить этот файл kml в сценарии (не на руку) в раздел «Мои карты» на Google Maps. У кого-нибудь есть Python или другой скрипт / код для этого?

1 Ответ

0 голосов
/ 29 сентября 2010

Сводка: Вы не можете, пока проблема 2590 не будет исправлена, что может занять некоторое время, потому что Google закрыл эту проблему как WontFix .Есть обходные пути, которые вы можете попытаться достичь того же конечного результата, но в его нынешнем виде вы не можете просто загрузить файл KML с помощью API данных Карт Google.

Длинная версия:

I не не имел никакого кода Python для этого, но API данных Google Maps позволяет вам делать это с помощью серии HTTP-запросов.См. Загрузка KML в разделе протокола HTTP Руководства для разработчиков для получения документации о том, как это сделать.Поэтому одним из возможных решений Python было бы использовать что-то вроде httplib в стандартной библиотеке для выполнения соответствующих HTTP-запросов за вас.

После различных правок и ваших отзывов в комментариях, вотСценарий, который принимает имя пользователя и пароль Google через командную строку (будьте осторожны, используя его!), чтобы получить переменную authorization_token, сделав запрос ClientLogin для аутентификации .При правильном имени пользователя и пароле токен авторизации может использоваться в заголовке Authorization для размещения данных KML в API данных Карт.

#!/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 отвечает на сообщение KML 400 Bad Request.По-видимому, это известная проблема ( 2590 , о которой сообщалось 22 июля 2010 г.), поэтому, пожалуйста, проголосуйте за нее и прокомментируйте ее, если хотите, чтобы Google исправил ее.Вы можете попробовать

  1. Создать карту без загрузки KML, а затем загрузить соответствующие функции KML, как это предлагается в комментарии № 9 по вопросу от Google, когда они подтвердили, чтоошибка существует.
  2. загрузка XML или загрузка CSV вместо KML, если эти методы поддерживают то, что вам нужно сделать
  3. возиться с форматомваших данных KML. Этот пост в группе Google для API предполагает, что это может помочь, но выглядит сложным.

Удачи

...