У меня есть скрипт Python, который генерирует файлы kml. Теперь я хочу загрузить этот файл kml в скрипте (не от руки) в раздел «мои карты» карт google. У кого-нибудь есть python или другой скрипт/код для этого?
как я могу загрузить файл kml со скриптом на карты google?
Ответы (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 исправил.
А пока, не исправив эту ошибку, вы можете попробовать
- Создайте карту, не загружая KML, а затем при необходимости загрузите функции KML, как это предлагается в комментарий №9 к проблеме от Google, когда они подтвердили существование ошибки.
- загрузка XML или загрузка CSV вместо KML, если эти методы поддерживают то, что вам нужно сделать.
- возиться с форматом ваших данных KML. Это сообщение в группе Google для API предполагает, что это может помочь, но выглядит сложно.
Удачи