Обработка событий мыши

Выберите платформу: 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();