To keep kids entertained, people from all over the world put a teddy bear in their window so that kids can spot them during a walk.
I don’t know the origin. It’s in Canada, USA, New Zealand, UK etc. It’s also in my hometown so I decided to make an app for it.
People made a Facebook group with a google form to submit the teddy bear and an URL with all bears on google maps.
I thought that I had to get access to the Google spreadsheet containing the data, but it seems that it would not hold that much info if we take a look at the entry form and the maps data. In Google maps you can download a KMZ file which is a zipped KML (Keyhole Markup Language) It’s XML. Here is the full KML:
So there is a web link in it to get the live data. I used the webclient to pull it in and read it and tried to make pins out of it.
My first step was to add the Xamarin.Forms.Map Nuget package and the SharpKml.Core
Here is the full code:
private void AddMap()
var map = new Map(MapSpan.FromCenterAndRadius(new Position(51.697815, 5.303675), Distance.FromMeters(10000)));
using (var client = new WebClient())
var kmz = KmzFile.Open(client.OpenRead("https://www.google.com/maps/d/u/0/kml?mid=1kedGv2twtsWmzgxRpZcu5hr-qpE77plL"));
Kml kml = kmz.GetDefaultKmlFile().Root as Kml;
if (kml != null)
foreach (Placemark placemark in kml.Flatten().OfType())
var pin = new Pin()
Address = placemark.Address,
Label = placemark.Name,
Type = PinType.Place
this.Content = map;
But the pins won’t show up (of course). Because I did not set the position. The real Kml contains data like this:
So as you can see there is no Latitude Longitude for the placemarks… So how does google maps work then? It seems that both Google Maps and Google Earth Geocode the address to get the lat lng. But that service unfortunately is not free. I tried to load the kml in Google Earth and export it, but that also does not add the latitude and longitude. I also thought that kml support for the map control could be used. So that I could just provide the kml to the map and have it sort it out, but that was build with monoandroid 9 instead of netstandard2.0 and would probably not fix the geocode issue.
I planned to make an app with no central backend. But because of geocoding, I would have to use a webapi or Azure Function to keep track of the “database” with all teddy bears and their corresponding lat lng. That would also lower the requests for geocoding if it would be moved from the phone (client) to the server.
But I’ve not found a good free geocoder
nominatim.openstreetmap.org does not work if I would provide the kml data. I think that I will come back to this one….
Good luck making your own KML/KMZ reading app!