Handle Region Boundary Click Event
Sample code for Google Maps Platform JavaScript API author(s): Justin Poehnelt
by Arun Tummala
HTML
<!DOCTYPE html>
<!--
@license
Copyright 2019 Google LLC. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
-->
<html>
<head>
<title>Handle Region Boundary Click Event</title>
<script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
<!-- jsFiddle will insert css and js -->
</head>
<body>
<div id="map">
<div id="layers">
<label for="layers_options">Choose a Layer:</label>
<select id="layers_options" name="layers_options">
<option value="County">County</option>
<option value="City">City</option>
<option value="Zip">Zip</option>
<option value="State">State</option>
</select>
</div>
</div>
<!--
The `defer` attribute causes the callback to execute after the full HTML
document has been parsed. For non-blocking uses, avoiding race conditions,
and consistent behavior across browsers, consider loading using Promises
with https://www.npmjs.com/package/@googlemaps/js-api-loader.
-->
<script
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=beta"
defer
></script>
</body>
</html>
CSS
/**
* @license
* Copyright 2022 Google LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
/*
* Always set the map height explicitly to define the size of the div element
* that contains the map.
*/
#map {
height: 100%;
}
#layers {
position: relative;
top: 100;
left: 100;
background-color: blue;
width: 100px;
height: 100px;
z-index: 10000;
}
/*
* Optional: Makes the sample page fill the window.
*/
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
JavaScript
/**
* @license
* Copyright 2022 Google LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
let map;
let featureLayer;
let infoWindow;
function initMap() {
map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 39.23, lng: -105.73 },
zoom: 8,
// In the cloud console, configure this Map ID with a style that enables the
// "Administrative Area Level 2" Data Driven Styling type.
mapId: "a3efe1c035bad51b", // <YOUR_MAP_ID_HERE>,
});
// Add the feature layer.
//@ts-ignore
featureLayer = map.getFeatureLayer("ADMINISTRATIVE_AREA_LEVEL_2");
// Add the event listener for the feature layer.
featureLayer.addListener("click", handlePlaceClick);
infoWindow = new google.maps.InfoWindow({});
// Apply style on load, to enable clicking.
applyStyleToSelected();
const toggleButton = document.createElement("select");
toggleButton.textContent = "Toggle";
toggleButton.classList.add("custom-map-control-button");
toggleButton.addEventListener("click", () => {
overlay.toggle();
});
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(toggleButton);
}
// Handle the click event.
function handlePlaceClick(event) {
let feature = event.features[0];
console.log(event);
if (!feature.placeId) return;
// Apply the style to the feature layer.
applyStyleToSelected(feature.placeId);
// Add the info window.
let content =
'<span style="font-size:small">Display name: ' +
feature.displayName +
"<br/> Place ID: " +
feature.placeId +
"<br/> Feature type: " +
feature.featureType +
"</span>";
updateInfoWindow(content, event.latLng);
}
// Stroke and fill with minimum opacity value.
//@ts-ignore
const styleDefault = {
strokeColor: "#810FCB",
strokeOpacity: 1.0,
strokeWeight: 2.0,
fillColor: "white",
fillOpacity: 0.1, // Polygons must be visible to receive click events.
};
// Style for the clicked Administrative Area Level 2 polygon.
//@ts-ignore
const...