Create a gist now

Instantly share code, notes, and snippets.

Embed
Export Google Maps starred locations
# -*- coding: utf-8 -*-
"""
Go to Google Bookmarks: https://www.google.com/bookmarks/
On the bottom left, click "Export bookmarks": https://www.google.com/bookmarks/bookmarks.html?hl=en
After downloading the html file, run this script on it to generate a KML.
"""
from lxml.html import document_fromstring
import simplekml
from urllib2 import urlopen
import re
import time
filename = r'GoogleBookmarks.html'
with open(filename) as bookmarks_file:
data = bookmarks_file.read()
kml = simplekml.Kml()
# Hacky and doesn't work for all of the stars:
lat_re = re.compile('markers:[^\]]*latlng[^}]*lat:([^,]*)')
lon_re = re.compile('markers:[^\]]*latlng[^}]*lng:([^}]*)')
coords_in_url = re.compile('\?q=(-?\d{,3}\.\d*),\s*(-?\d{,3}\.\d*)')
doc = document_fromstring(data)
for element, attribute, url, pos in doc.body.iterlinks():
if 'maps.google' in url:
description = element.text or ''
print description.encode('UTF8')
print u"URL: {0}".format(url)
if coords_in_url.search(url):
# Coordinates are in URL itself
latitude = coords_in_url.search(url).groups()[0]
longitude = coords_in_url.search(url).groups()[1]
else:
# Load map and find coordinates in source of page
try:
sock = urlopen(url.replace(' ','+').encode('UTF8'))
except Exception, e:
print 'Connection problem:'
print repr(e)
print 'Waiting 2 minutes and trying again'
time.sleep(120)
sock = urlopen(url.replace(' ','+').encode('UTF8'))
content = sock.read()
sock.close()
time.sleep(3) # Don't annoy server
try:
latitude = lat_re.findall(content)[0]
longitude = lon_re.findall(content)[0]
except IndexError:
print '[Coordinates not found]'
print
continue
print latitude, longitude
try:
kml.newpoint(name=description,
coords=[(float(longitude), float(latitude))])
except ValueError:
print '[Invalid coordinates]'
print
kml.save("GoogleBookmarks.kml")
@marado

This comment has been minimized.

Show comment
Hide comment
@marado

marado Aug 15, 2014

I'm using (part of) this at https://github.com/marado/stars-to-addresses . I am assuming I can, since there's no LICENSE information for this gist, but I wouldn't mind getting explicit permission.

marado commented Aug 15, 2014

I'm using (part of) this at https://github.com/marado/stars-to-addresses . I am assuming I can, since there's no LICENSE information for this gist, but I wouldn't mind getting explicit permission.

@endolith

This comment has been minimized.

Show comment
Hide comment
@endolith

endolith Sep 25, 2014

You have explicit permission! :)

Owner

endolith commented Sep 25, 2014

You have explicit permission! :)

@samirkothari89

This comment has been minimized.

Show comment
Hide comment
@samirkothari89

samirkothari89 Jun 18, 2015

How do you run the html file in KML? I did get all the names of my bookmarks (thank you for that)

How do you run the html file in KML? I did get all the names of my bookmarks (thank you for that)

@iturki

This comment has been minimized.

Show comment
Hide comment
@iturki

iturki Dec 28, 2015

Or, you can use this online tool to do the html > KML conversion:
http://gexport.somee.com/

iturki commented Dec 28, 2015

Or, you can use this online tool to do the html > KML conversion:
http://gexport.somee.com/

@jbg

This comment has been minimized.

Show comment
Hide comment
@jbg

jbg Apr 5, 2016

I made a Python 3, GeoJSON-exporting version based on this script here:
https://gist.github.com/jbg/60bf54b8f19c0a42abf7091c486d17fc

jbg commented Apr 5, 2016

I made a Python 3, GeoJSON-exporting version based on this script here:
https://gist.github.com/jbg/60bf54b8f19c0a42abf7091c486d17fc

@ngzhian

This comment has been minimized.

Show comment
Hide comment
@ngzhian

ngzhian Jun 28, 2016

I updated the regex for lat, lng based on the most recent google response, here's the gist: https://gist.github.com/ngzhian/73c51bcb44c8bfd8dc02d4aa538fb83f

ngzhian commented Jun 28, 2016

I updated the regex for lat, lng based on the most recent google response, here's the gist: https://gist.github.com/ngzhian/73c51bcb44c8bfd8dc02d4aa538fb83f

@3v1n0

This comment has been minimized.

Show comment
Hide comment
@3v1n0

3v1n0 Jan 11, 2017

Thanks, I guess you want to merge changes from @ngzhian in order to get this working properly with new APIs

3v1n0 commented Jan 11, 2017

Thanks, I guess you want to merge changes from @ngzhian in order to get this working properly with new APIs

@heyarne

This comment has been minimized.

Show comment
Hide comment
@heyarne

heyarne Jan 29, 2017

Hey! Just a quick heads up: I packaged it up a bit with a proper requirements.txt and put it up on https://github.com/heyarne/bookmarks-to-kml. I hope that's fine. If it's ok i'd also like to build a simple web interface around it, but because of the missing license file I didn't want to do it without permission. Any objections?

heyarne commented Jan 29, 2017

Hey! Just a quick heads up: I packaged it up a bit with a proper requirements.txt and put it up on https://github.com/heyarne/bookmarks-to-kml. I hope that's fine. If it's ok i'd also like to build a simple web interface around it, but because of the missing license file I didn't want to do it without permission. Any objections?

@dmrsouza

This comment has been minimized.

Show comment
Hide comment
@dmrsouza

dmrsouza Feb 24, 2017

I've made another script that converts Google Maps JSON to KML. It is more complete and it works flawless! Check here: https://github.com/dmrsouza/json2kml

I've made another script that converts Google Maps JSON to KML. It is more complete and it works flawless! Check here: https://github.com/dmrsouza/json2kml

@LaDeeDaDee

This comment has been minimized.

Show comment
Hide comment
@LaDeeDaDee

LaDeeDaDee Mar 3, 2017

@dmrsouza flawless if you know can run simplekml via a pip...

'pip' is not recognized as an internal or external command,
operable program or batch file.

How do I install simplekml via pip? I have downloaded simplekml 1.3.0 but I'm not sure if it is installed?

LaDeeDaDee commented Mar 3, 2017

@dmrsouza flawless if you know can run simplekml via a pip...

'pip' is not recognized as an internal or external command,
operable program or batch file.

How do I install simplekml via pip? I have downloaded simplekml 1.3.0 but I'm not sure if it is installed?

@dmrsouza

This comment has been minimized.

Show comment
Hide comment
@dmrsouza

dmrsouza Mar 4, 2017

@LaDeeDaDee At least on Windows pip command is installed with Python. Anyway there are instructions about how to install pip at https://docs.python.org/3/installing/

dmrsouza commented Mar 4, 2017

@LaDeeDaDee At least on Windows pip command is installed with Python. Anyway there are instructions about how to install pip at https://docs.python.org/3/installing/

@rlewandowski1988

This comment has been minimized.

Show comment
Hide comment
@rlewandowski1988

rlewandowski1988 Mar 11, 2017

Gentlemen,
I am a beginner with python, but managed to get through the installation, pip.. now I'm stuck here:

C:\Users\Kierownik\Desktop\json2kml>json2kml.py
Opening file "Saved Places.json"
Traceback (most recent call last):
File "C:\Users\Kierownik\Desktop\json2kml\json2kml.py", line 32, in
for place in data["features"]:
KeyError: 'features'

Would you, please, be able to help?

Thanks!

Gentlemen,
I am a beginner with python, but managed to get through the installation, pip.. now I'm stuck here:

C:\Users\Kierownik\Desktop\json2kml>json2kml.py
Opening file "Saved Places.json"
Traceback (most recent call last):
File "C:\Users\Kierownik\Desktop\json2kml\json2kml.py", line 32, in
for place in data["features"]:
KeyError: 'features'

Would you, please, be able to help?

Thanks!

@dmrsouza

This comment has been minimized.

Show comment
Hide comment
@dmrsouza

dmrsouza Mar 19, 2017

@rlewandowski1988, please check your JSON file (open it in a text editor). It should start as:

{ "type" : "FeatureCollection", "features" : [ { "geometry" : { "coordinates" :........

It seems it is missing the "features" section. If your data is not private and if you can share your JSON file, I am willing to help you.

@rlewandowski1988, please check your JSON file (open it in a text editor). It should start as:

{ "type" : "FeatureCollection", "features" : [ { "geometry" : { "coordinates" :........

It seems it is missing the "features" section. If your data is not private and if you can share your JSON file, I am willing to help you.

@rlewandowski1988

This comment has been minimized.

Show comment
Hide comment
@rlewandowski1988

rlewandowski1988 Apr 2, 2017

@dmrsouza, I previously gave up becaue I realised that google introduced new feature under saving your places - now you can save and give the location one of the categories: Favorites, Want to go, Starred places or New list (you create one). Knowing that I just thought that they probably changed the data structure and that's why json2kml.py stopped working... but it turned out that insted of downloading Maps (your places) I downloaded the Location history ;) Nevertheless your comment helped! thanks very much for help! all the very best! ;)

@dmrsouza, I previously gave up becaue I realised that google introduced new feature under saving your places - now you can save and give the location one of the categories: Favorites, Want to go, Starred places or New list (you create one). Knowing that I just thought that they probably changed the data structure and that's why json2kml.py stopped working... but it turned out that insted of downloading Maps (your places) I downloaded the Location history ;) Nevertheless your comment helped! thanks very much for help! all the very best! ;)

@blaines

This comment has been minimized.

Show comment
Hide comment
@blaines

blaines Jul 26, 2017

Google says "No Data Found" for all of my accounts when exporting "Maps (your places)". Boo

Trying the bookmarks approach instead

blaines commented Jul 26, 2017

Google says "No Data Found" for all of my accounts when exporting "Maps (your places)". Boo

Trying the bookmarks approach instead

@andriip

This comment has been minimized.

Show comment
Hide comment
@andriip

andriip Aug 4, 2017

@rlewandowski1988, Hi did you try this script with your Location History file?
Is it working?

andriip commented Aug 4, 2017

@rlewandowski1988, Hi did you try this script with your Location History file?
Is it working?

@YvesBas

This comment has been minimized.

Show comment
Hide comment
@YvesBas

YvesBas Nov 1, 2017

Thanks for this very useful script! However I would need to get also the custom labels I added to my starred locations to be able to use this data on another GIS. Do you think it would be possible to get the labels??

YvesBas commented Nov 1, 2017

Thanks for this very useful script! However I would need to get also the custom labels I added to my starred locations to be able to use this data on another GIS. Do you think it would be possible to get the labels??

@eszjay

This comment has been minimized.

Show comment
Hide comment
@eszjay

eszjay Dec 4, 2017

Google has now provided their own tool to export your Map data in JSON format at Google Takeout

eszjay commented Dec 4, 2017

Google has now provided their own tool to export your Map data in JSON format at Google Takeout

@bhatiagagan

This comment has been minimized.

Show comment
Hide comment
@bhatiagagan

bhatiagagan Feb 22, 2018

@heyarne I tried using your script as it's exactly what I need in my situation ( don't have access to old account but downloaded the HTML file), but I got this error 'No module named simplekml '
I tried installing simplekml with pip install simplekmp, but got the following error-

Any help would be appreciated, I'm a super noob here...but could really use all my 1000s of bookmarks in the new account...

Collecting simplekml
Using cached simplekml-1.3.0.zip
Installing collected packages: simplekml
Running setup.py install for simplekml ... error
Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;file='/private/var/folders/jk/6y47vn0d2gdcd9v84g51zz8h0000gn/T/pip-build-Vgk14q/simplekml/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /var/folders/jk/6y47vn0d2gdcd9v84g51zz8h0000gn/T/pip-ZB2nDK-record/install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_py
.......
copying simplekml/coordinates.py -> build/lib/simplekml
copying simplekml/schema.py -> build/lib/simplekml
running install_lib
creating /Library/Python/2.7/site-packages/simplekml
error: could not create '/Library/Python/2.7/site-packages/simplekml': Permission denied

@heyarne I tried using your script as it's exactly what I need in my situation ( don't have access to old account but downloaded the HTML file), but I got this error 'No module named simplekml '
I tried installing simplekml with pip install simplekmp, but got the following error-

Any help would be appreciated, I'm a super noob here...but could really use all my 1000s of bookmarks in the new account...

Collecting simplekml
Using cached simplekml-1.3.0.zip
Installing collected packages: simplekml
Running setup.py install for simplekml ... error
Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;file='/private/var/folders/jk/6y47vn0d2gdcd9v84g51zz8h0000gn/T/pip-build-Vgk14q/simplekml/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /var/folders/jk/6y47vn0d2gdcd9v84g51zz8h0000gn/T/pip-ZB2nDK-record/install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_py
.......
copying simplekml/coordinates.py -> build/lib/simplekml
copying simplekml/schema.py -> build/lib/simplekml
running install_lib
creating /Library/Python/2.7/site-packages/simplekml
error: could not create '/Library/Python/2.7/site-packages/simplekml': Permission denied

@walidvb

This comment has been minimized.

Show comment
Hide comment
@walidvb

walidvb Apr 13, 2018

@bhatiagagan, try to install with sudo

walidvb commented Apr 13, 2018

@bhatiagagan, try to install with sudo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment