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

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


person Jörg Beyer    schedule 28.09.2010    source источник


Ответы (1)


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

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

У меня не не было никакого кода Python для этого, но Google Maps Data API позволяет сделать это с помощью серии HTTP-запросов. См. раздел Загрузка KML в разделе HTTP-протокола < href="http://code.google.com/apis/maps/documentation/mapsdata/developers_guide.html" rel="nofollow">Руководство для разработчиков с документацией о том, как это сделать. Таким образом, одним из возможных решений Python было бы использование чего-то вроде http://docs.python.org/library/httplib.html в стандартной библиотеке для выполнения соответствующие 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 предполагает, что это может помочь, но выглядит сложно.

Удачи

person Day    schedule 28.09.2010
comment
извините, но я получаю 400 Bad Request Bad request, и я не знаю, как это отлаживать. - person Jörg Beyer; 06.10.2010
comment
@ Йорг Бейер Странно. Обычно вы получаете 400 только в том случае, если запрос по какой-то причине не является допустимым HTTP-запросом. Я обновил свой ответ, пожалуйста, попробуйте скрипт, он должен работать как есть. - person Day; 07.10.2010
comment
Я все еще получаю 400 Bad Request. Я уверен, что токен аутентификации в порядке, потому что я получаю 401, когда изменяю свой только что сгенерированный токен. - person Jörg Beyer; 08.10.2010
comment
@Jörg Beyer: Возможно, Google не нравится ваш KML и он считает его недействительным? Вы используете свой или мой пример? Обратите внимание, что на самом деле у меня не было времени попробовать мой скрипт с моим настоящим токеном авторизации, может быть, завтра. Продолжайте пробовать ;) - person Day; 09.10.2010
comment
Вы, наверное, уже проверили, но что говорит тело ответа 400? Дает ли он более подробную информацию об ошибке? - person Day; 09.10.2010
comment
нет, он просто повторяет Bad Request - есть идеи по дальнейшей отладке? - person Jörg Beyer; 12.10.2010
comment
@Jörg Beyer: Хорошо, похоже, это известная проблема с API/документами! См. code.google.com/p/gmaps-api. -issues/issues/detail?id=2590 и, пожалуйста, проголосуйте за проблему (отметьте ее звездочкой) и/или добавьте туда свои комментарии, чтобы продвигать ее. Может быть, вам больше повезет при загрузке XML или CSV, если для решения вашей проблемы не требуется KML? Я снова обновлю свой ответ своим последним кодом, который я полностью протестировал с помощью реального журнала Google, который также дает мне ошибку 400 :( - person Day; 13.10.2010
comment
Похоже, что Google сейчас реагирует на проблему, поэтому, пожалуйста, поработайте с ними над вашей конкретной проблемой и, пожалуйста, сообщите здесь, когда у вас будет исправление или обходной путь;) - person Day; 13.10.2010
comment
Google подтвердил проблему и предложил обходной путь: code.google.com/p/gmaps-api-issues/issues/detail?id=2590#c9 - person Day; 27.10.2010
comment
Сегодня Google установил для этой ошибки статус WontFix code.google.com/p/gmaps-api-issues/issues/detail?id=2590#c13. Лучше дайте им знать, если вы считаете иначе. - person Day; 09.12.2010