title: Cities Geojson polygons database/library or API
body: <p>I have a MongoDB database of markers with lat/long and I need another database (or other solution) containing cities, or area level boundaries. If in Geojson polygons it would have been optimal.</p>
  
  <p>I have a field named city (e.g. <code>'city' : 'New York'</code>) but I want to narrow down to a city's area/neighborhood level e.g. "Soho". The idea to solve the problem this way is based on Google's new maps. If we type area or zip code we see the red-dotted polygon of that area.</p>
  
  <p><img src="https://i.stack.imgur.com/MdhES.png" alt="enter image description here"></p>
  
  <p>I saw <a href="http://www.maxmind.com/en/city" rel="nofollow noreferrer">Maxmind's</a> database but it does not have boundaries per city.</p>
  
  <p>My best solution so far is to use <a href="https://developers.google.com/maps/documentation/geocoding/?hl=en" rel="nofollow noreferrer">Google's Geocoding API</a> which returns a box's bounds:</p>
  
  <p>e.g. for: <a href="http://maps.googleapis.com/maps/api/geocode/json?address=soho&amp;sensor=false" rel="nofollow noreferrer">http://maps.googleapis.com/maps/api/geocode/json?address=soho&amp;sensor=false</a></p>
  
  <p>Result:</p>
  
  <pre><code>{
     "results" : [
        {
           "address_components" : [
              {
                 "long_name" : "SoHo",
                 "short_name" : "SoHo",
                 "types" : [ "neighborhood", "political" ]
              },
              {
                 "long_name" : "Manhattan",
                 "short_name" : "Manhattan",
                 "types" : [ "sublocality", "political" ]
              },
              {
                 "long_name" : "New York",
                 "short_name" : "New York",
                 "types" : [ "locality", "political" ]
              },
              {
                 "long_name" : "New York",
                 "short_name" : "New York",
                 "types" : [ "administrative_area_level_2", "political" ]
              },
              {
                 "long_name" : "New York",
                 "short_name" : "NY",
                 "types" : [ "administrative_area_level_1", "political" ]
              },
              {
                 "long_name" : "United States",
                 "short_name" : "US",
                 "types" : [ "country", "political" ]
              }
           ],
           "formatted_address" : "SoHo, New York, NY, USA",
           "geometry" : {
              "bounds" : {
                 "northeast" : {
                    "lat" : 40.7283442,
                    "lng" : -73.9953929
                 },
                 "southwest" : {
                    "lat" : 40.7184446,
                    "lng" : -74.0054619
                 }
              },
              "location" : {
                 "lat" : 40.723384,
                 "lng" : -74.001704
              },
              "location_type" : "APPROXIMATE",
              "viewport" : {
                 "northeast" : {
                    "lat" : 40.7283442,
                    "lng" : -73.9953929
                 },
                 "southwest" : {
                    "lat" : 40.7184446,
                    "lng" : -74.0054619
                 }
              }
           },
           "types" : [ "neighborhood", "political" ]
        }
     ],
     "status" : "OK"
  }
  </code></pre>
  
  <p>Any better approach than using Google's geocoding API's bounding box?</p>