处理鼠标事件

请选择平台: Android iOS JavaScript

您可以让数据地图项响应 mousemove 和 click 事件,并使用它们根据用户互动情况来更改地图项的外观。

启用数据集图层事件

如果要在数据集图层上启用事件,请按以下步骤操作:

  1. 在数据集图层上为每个要注册的事件调用 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;
        }
    });

  2. 添加事件处理脚本代码,以便根据互动类型为所选地图项设置样式。

    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;
    }

  3. 使用地图项样式函数来应用样式。此处显示的地图项样式函数会根据互动类型有条件地应用样式。此处定义了三种样式:一种用于在 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();