請將資料地圖項目設計成能夠回應 mousemove 和 click 事件,並使用這些地圖項目,根據使用者互動來變更地圖項目的外觀。
啟用資料集圖層事件
請按照下列步驟啟用資料集圖層上的事件:
找出您要註冊的每個事件,對資料集圖層呼叫
addListener()函式,註冊事件通知的資料集圖層。在本例中,地圖也會取得事件監聽器。TypeScript
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; } });
JavaScript
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; } });
您可以根據互動類型,加入事件處理常式程式碼來設定所選地圖項目的樣式。
TypeScript
// Note, 'globalid' is an attribute in this Dataset. function handleClick(event: google.maps.FeatureMouseEvent) { if (event.features) { lastClickedFeatureIds = event.features.map( (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid ); } datasetLayer.style = applyStyle; } function handleMouseMove(event: google.maps.FeatureMouseEvent) { if (event.features) { lastInteractedFeatureIds = event.features.map( (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid ); } datasetLayer.style = applyStyle; }
JavaScript
// Note, 'globalid' is an attribute in this Dataset. function handleClick(event) { if (event.features) { lastClickedFeatureIds = event.features.map( (f) => f.datasetAttributes.globalid ); } datasetLayer.style = applyStyle; } function handleMouseMove(event) { if (event.features) { lastInteractedFeatureIds = event.features.map( (f) => f.datasetAttributes.globalid ); } datasetLayer.style = applyStyle; }
您可以使用地圖項目樣式函式來套用樣式。這裡顯示的地圖項目樣式函式,會有條件地根據互動類型套用樣式。這裡會定義三種樣式:一種是在發生
mousemove時將邊界設為粗體,一種是在發生click時變更背景,一種則是預設樣式。TypeScript
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(params: google.maps.FeatureStyleFunctionOptions) { const datasetFeature = params.feature; // Note, 'globalid' is an attribute in this dataset. if ( lastClickedFeatureIds.includes( (datasetFeature as google.maps.DatasetFeature).datasetAttributes .globalid ) ) { return styleClicked; } if ( lastInteractedFeatureIds.includes( (datasetFeature as google.maps.DatasetFeature).datasetAttributes .globalid ) ) { return styleMouseMove; } return styleDefault; }
JavaScript
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(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; }
完整程式碼範例
TypeScript
const mapElement = document.querySelector('gmp-map')!; let innerMap: google.maps.Map; let lastInteractedFeatureIds: string[] = []; let lastClickedFeatureIds: string[] = []; let datasetLayer: google.maps.FeatureLayer; // Note, 'globalid' is an attribute in this Dataset. function handleClick(event: google.maps.FeatureMouseEvent) { if (event.features) { lastClickedFeatureIds = event.features.map( (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid ); } datasetLayer.style = applyStyle; } function handleMouseMove(event: google.maps.FeatureMouseEvent) { if (event.features) { lastInteractedFeatureIds = event.features.map( (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid ); } datasetLayer.style = applyStyle; } async function init() { // Request needed libraries. await google.maps.importLibrary('maps'); // Get the inner map. innerMap = mapElement.innerMap; // Dataset ID for NYC park data. const datasetId = 'a75dd002-ad20-4fe6-af60-27cd2ed636b4'; 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; } }); } 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(params: google.maps.FeatureStyleFunctionOptions) { const datasetFeature = params.feature; // Note, 'globalid' is an attribute in this dataset. if ( lastClickedFeatureIds.includes( (datasetFeature as google.maps.DatasetFeature).datasetAttributes .globalid ) ) { return styleClicked; } if ( lastInteractedFeatureIds.includes( (datasetFeature as google.maps.DatasetFeature).datasetAttributes .globalid ) ) { return styleMouseMove; } return styleDefault; } void init();
JavaScript
const mapElement = document.querySelector('gmp-map'); let innerMap; let lastInteractedFeatureIds = []; let lastClickedFeatureIds = []; let datasetLayer; // Note, 'globalid' is an attribute in this Dataset. function handleClick(event) { if (event.features) { lastClickedFeatureIds = event.features.map( (f) => f.datasetAttributes.globalid ); } datasetLayer.style = applyStyle; } function handleMouseMove(event) { if (event.features) { lastInteractedFeatureIds = event.features.map( (f) => f.datasetAttributes.globalid ); } datasetLayer.style = applyStyle; } async function init() { // Request needed libraries. await google.maps.importLibrary('maps'); // Get the inner map. innerMap = mapElement.innerMap; // Dataset ID for NYC park data. const datasetId = 'a75dd002-ad20-4fe6-af60-27cd2ed636b4'; 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; } }); } 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(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; } void init();