Как я могу загрузить файл kml со скриптом на карты Google?

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

1 ответ

Решение

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

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

У меня не было кода Python для этого, но API данных Карт Google позволяет вам делать это с помощью серии 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 Group для API предполагает, что это может помочь, но выглядит сложным.

Удачи

Другие вопросы по тегам