diff --git a/samples/dds-datasets-polygon-click/README.md b/samples/dds-datasets-polygon-click/README.md new file mode 100644 index 00000000..9712a770 --- /dev/null +++ b/samples/dds-datasets-polygon-click/README.md @@ -0,0 +1,41 @@ +# Google Maps JavaScript Sample + +## dds-datasets-polygon-click + +This sample shows how to make data features respond to mouse events. + +## Setup + +### Before starting run: + +`npm i` + +### Run an example on a local web server + +`cd samples/dds-datasets-polygon-click` +`npm start` + +### Build an individual example + +`cd samples/dds-datasets-polygon-click` +`npm run build` + +From 'samples': + +`npm run build --workspace=dds-datasets-polygon-click/` + +### Build all of the examples. + +From 'samples': + +`npm run build-all` + +### Run lint to check for problems + +`cd samples/dds-datasets-polygon-click` +`npx eslint index.ts` + +## Feedback + +For feedback related to this sample, please open a new issue on +[GitHub](https://github.com/googlemaps-samples/js-api-samples/issues). diff --git a/samples/dds-datasets-polygon-click/index.html b/samples/dds-datasets-polygon-click/index.html new file mode 100644 index 00000000..2afa29fc --- /dev/null +++ b/samples/dds-datasets-polygon-click/index.html @@ -0,0 +1,30 @@ + + + + + + Style a polygon data feature + + + + + + + + +
+ Data source: NYC Open Data +
+
+ + + diff --git a/samples/dds-datasets-polygon-click/index.ts b/samples/dds-datasets-polygon-click/index.ts new file mode 100644 index 00000000..fbf26529 --- /dev/null +++ b/samples/dds-datasets-polygon-click/index.ts @@ -0,0 +1,109 @@ +/** + * @license + * Copyright 2026 Google LLC. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +// [START maps_dds_datasets_polygon_click] +const mapElement = document.querySelector('gmp-map') as google.maps.MapElement; +let innerMap; +let lastInteractedFeatureIds: string[] = []; +let lastClickedFeatureIds: string[] = []; +let datasetLayer; + +// [START maps_dds_datasets_polygon_click_eventhandler] +// Note, 'globalid' is an attribute in this Dataset. +function handleClick(/* MouseEvent */ e) { + if (e.features) { + lastClickedFeatureIds = e.features.map( + (f) => f.datasetAttributes['globalid'] + ); + } + datasetLayer.style = applyStyle; +} + +function handleMouseMove(/* MouseEvent */ e) { + if (e.features) { + lastInteractedFeatureIds = e.features.map( + (f) => f.datasetAttributes['globalid'] + ); + } + datasetLayer.style = applyStyle; +} +// [END maps_dds_datasets_polygon_click_eventhandler] + +async function initMap() { + // Request needed libraries. + (await google.maps.importLibrary('maps')) as google.maps.MapsLibrary; + + // Get the inner map. + innerMap = mapElement.innerMap; + + // Dataset ID for NYC park data. + const datasetId = 'a75dd002-ad20-4fe6-af60-27cd2ed636b4'; + + // [START maps_dds_datasets_polygon_click_addlistener] + datasetLayer = innerMap.getDatasetFeatureLayer(datasetId); + datasetLayer.style = applyStyle; + + datasetLayer.addListener('click', handleClick); + datasetLayer.addListener('mousemove', handleMouseMove); + + // Map event listener. + innerMap.addListener('mousemove', () => { + // If the map gets a mousemove, that means there are no feature layers + // with listeners registered under the mouse, so we clear the last + // interacted feature ids. + if (lastInteractedFeatureIds?.length) { + lastInteractedFeatureIds = []; + datasetLayer.style = applyStyle; + } + }); + // [END maps_dds_datasets_polygon_click_addlistener] +} + +// [START maps_dds_datasets_polygon_click_stylefunction] +const styleDefault = { + strokeColor: 'green', + strokeWeight: 2.0, + strokeOpacity: 1.0, + fillColor: 'green', + fillOpacity: 0.3, +}; + +const styleClicked = { + ...styleDefault, + strokeColor: 'blue', + fillColor: 'blue', + fillOpacity: 0.5, +}; + +const styleMouseMove = { + ...styleDefault, + strokeWeight: 4.0, +}; + +function applyStyle(/* FeatureStyleFunctionOptions */ params) { + const datasetFeature = params.feature; + + // Note, 'globalid' is an attribute in this dataset. + if ( + lastClickedFeatureIds.includes( + datasetFeature.datasetAttributes['globalid'] + ) + ) { + return styleClicked; + } + + if ( + lastInteractedFeatureIds.includes( + datasetFeature.datasetAttributes['globalid'] + ) + ) { + return styleMouseMove; + } + return styleDefault; +} +// [END maps_dds_datasets_polygon_click_stylefunction] + +initMap(); +// [END maps_dds_datasets_polygon_click] diff --git a/samples/dds-datasets-polygon-click/package.json b/samples/dds-datasets-polygon-click/package.json new file mode 100644 index 00000000..3b76c62c --- /dev/null +++ b/samples/dds-datasets-polygon-click/package.json @@ -0,0 +1,14 @@ +{ + "name": "@js-api-samples/dds-datasets-polygon-click", + "version": "1.0.0", + "scripts": { + "build": "tsc && bash ../jsfiddle.sh dds-datasets-polygon-click && bash ../app.sh dds-datasets-polygon-click && bash ../docs.sh dds-datasets-polygon-click && npm run build:vite --workspace=. && bash ../dist.sh dds-datasets-polygon-click", + "test": "tsc && npm run build:vite --workspace=.", + "start": "tsc && vite build --base './' && vite", + "build:vite": "vite build --base './'", + "preview": "vite preview" + }, + "dependencies": { + + } +} diff --git a/samples/dds-datasets-polygon-click/style.css b/samples/dds-datasets-polygon-click/style.css new file mode 100644 index 00000000..f9de7495 --- /dev/null +++ b/samples/dds-datasets-polygon-click/style.css @@ -0,0 +1,24 @@ +/** + * @license + * Copyright 2026 Google LLC. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/* [START maps_dds_datasets_polygon_click] */ +/* + * Optional: Makes the sample page fill the window. + */ +html, +body { + height: 100%; + margin: 0; + padding: 0; +} + +#attribution { + background-color: rgba(255, 255, 255, 0.7); + font-family: 'Roboto', 'Arial', 'sans-serif'; + font-size: 10px; + padding: 2px; + margin: 2px; +} +/* [END maps_dds_datasets_polygon_click] */ diff --git a/samples/dds-datasets-polygon-click/tsconfig.json b/samples/dds-datasets-polygon-click/tsconfig.json new file mode 100644 index 00000000..366aabb0 --- /dev/null +++ b/samples/dds-datasets-polygon-click/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "strict": true, + "noImplicitAny": false, + "lib": [ + "es2015", + "esnext", + "es6", + "dom", + "dom.iterable" + ], + "moduleResolution": "Node", + "jsx": "preserve" + } +}