マウスイベントを処理する

プラットフォームを選択: 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 時に背景を変更するスタイル、および既定のスタイルの 3 つのスタイルが定義されています。

    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();