Reverse geocoding

April 19, 2018 ยท View on GitHub

Basic usage

This plugin supports reverse geocoding. You can convert from latitude and longitude to address.

<div id="map_canvas1"></div>
map1: GoogleMap;

loadMap1() {

  this.map1 = GoogleMaps.create('map_canvas1', {
    camera: {
      target: { "lat": 37.422858, "lng": -122.085065 },
      zoom: 10
    }
  });

  this.map1.on(GoogleMapsEvent.MAP_CLICK).subscribe((params:any[]) => {
    let latLng: ILatLng = params[0];
    let marker: Marker = this.map1.addMarkerSync({
      "position": latLng
    });

    // Latitude, longitude -> address
    Geocoder.geocode({
      "position": latLng
    }).then((results: GeocoderResult[]) => {
      if (results.length == 0) {
        // Not found
        return null;
      }
      let address: any = [
        results[0].subThoroughfare || "",
        results[0].thoroughfare || "",
        results[0].locality || "",
        results[0].adminArea || "",
        results[0].postalCode || "",
        results[0].country || ""].join(", ");

      marker.setTitle(address);
      marker.showInfoWindow();
    });
  });

}


Multiple requests

You can pass multiple latitude/longitude in one request as Array. In this case, the method passes an instance of BaseArrayClass, then you will receive each results one by one.

The instance of BaseArrayClass triggers the finish event when all requests are completed.

If any error occurs during the requests processing, the instance triggers error event.

<div id="map_canvas2">
    <span class="smallPanel"><button>Click here!</button></span>
</div>
map2: GoogleMap;
isRunning: boolean = false;

loadMap2() {
  this.map2 = GoogleMaps.create('map_canvas2', {
    camera: {
      target: [
        { "lat": 42.452030, "lng": -71.537014 },
        { "lat": 43.385365, "lng": -70.542110 }
      ]
    }
  });
}

onButton2_click(event) {
  if (this.isRunning) {
    return;
  }
  this.isRunning = true;

  let start = Date.now();

  // Geocode multiple location
  Geocoder.geocode({
    "position": [
      { "lat": 43.031873, "lng": -71.073203 },
      { "lat": 42.989763, "lng": -70.932044 },
      { "lat": 43.04871, "lng": -70.816345 },
      { "lat": 42.882128, "lng": -70.86808 },
      { "lat": 43.092318, "lng": -70.792327 },
      { "lat": 43.077086, "lng": -70.758064 },
      { "lat": 42.807206, "lng": -71.102071 },
      { "lat": 42.811138, "lng": -70.869501 },
      { "lat": 43.111116, "lng": -70.734091 },
      { "lat": 42.786955, "lng": -71.115836 },
      { "lat": 43.221256, "lng": -70.888115 },
      { "lat": 43.232909, "lng": -70.8818 },
      { "lat": 42.744153230002, "lng": -71.157345224281 },
      { "lat": 42.764387, "lng": -71.216689 },
      { "lat": 42.741881, "lng": -71.160069 },
      { "lat": 42.960288, "lng": -71.438445 },
      { "lat": 42.94327, "lng": -71.4741 },
      { "lat": 42.665865, "lng": -71.115143 },
      { "lat": 42.656393, "lng": -71.140289 },
      { "lat": 43.222904, "lng": -71.491969 },
      { "lat": 42.76513, "lng": -71.49744 },
      { "lat": 42.585366, "lng": -70.88444 },
      { "lat": 42.700708, "lng": -71.436142 },
      { "lat": 42.80103, "lng": -71.537014 },
      { "lat": 42.62462, "lng": -71.31845 },
      { "lat": 42.556249, "lng": -70.890407 },
      { "lat": 42.623739, "lng": -71.36431 },
      { "lat": 42.545939, "lng": -70.946655 },
      { "lat": 42.54524, "lng": -70.94468 },
      { "lat": 42.555543, "lng": -71.181095 },
      { "lat": 42.581632, "lng": -71.289347 },
      { "lat": 42.519991, "lng": -71.093858 },
      { "lat": 42.518951, "lng": -70.894874 },
      { "lat": 42.515659, "lng": -71.104029 },
      { "lat": 42.518122, "lng": -71.135588 },
      { "lat": 42.517323483467, "lng": -71.135712417913 },
      { "lat": 43.385365, "lng": -70.54211 },
      { "lat": 43.385365, "lng": -70.54211 },
      { "lat": 42.49818, "lng": -71.125908 },
      { "lat": 42.502632, "lng": -70.856048 },
      { "lat": 42.488115938014, "lng": -71.0194 },
      { "lat": 42.484973, "lng": -70.901011 },
      { "lat": 42.478313, "lng": -71.023173 },
      { "lat": 42.566563, "lng": -71.421995 },
      { "lat": 42.48755, "lng": -71.20229 },
      { "lat": 42.489622, "lng": -71.27235 },
      { "lat": 42.455468, "lng": -71.064841 },
      { "lat": 42.45203, "lng": -71.136821 },
      { "lat": 42.453613, "lng": -71.233316 }
    ]
  }).then((mvcArray: BaseArrayClass<GeocoderResult[]>) => {

    mvcArray.one('finish').then(() => {
      if (mvcArray.getLength() > 0) {
        let results: any[] =  mvcArray.getArray();
        results.forEach((result: GeocoderResult[]) => {

          // Get a result
          let address: string = [
            result[0].subThoroughfare || "",
            result[0].thoroughfare || "",
            result[0].locality || "",
            result[0].adminArea || "",
            result[0].postalCode || "",
            result[0].country || ""].join(", ");

          let marker: Marker = this.map2.addMarkerSync({
            'position': result[0].position,
            'icon': 'assets/starbucks.gif',
            'title': address
          });
          marker.on(GoogleMapsEvent.MARKER_CLICK).subscribe(this.onMarkerClick.bind(this));

        });
      }

      let end = Date.now();
      this.isRunning = false;
      console.log('finish', mvcArray.getArray());
      alert("duration: " + ((end - start) / 1000).toFixed(1) + " seconds");
    });

  });
}


onMarkerClick(params: any[]) {
  let marker: Marker = params[1];
  marker.showInfoWindow();
}