Interaction & Events
The SDK provides rich map interaction features and an event system, supporting various interaction methods including mouse, touch, keyboard, etc.
Mouse Interactions
Click Event
javascript
// Listen to map click
sdk.on("click", (e) => {
console.log("Click position:", e.lngLat);
console.log("Clicked features:", e.features);
// Query features at click position
const features = sdk.queryRenderedFeatures(e.point);
console.log("Queried features:", features);
});
// Listen to specific layer click
sdk.on("click", "airport", (e) => {
console.log("Clicked airport layer:", e.features[0]);
});Double Click Event
javascript
sdk.on("dblclick", (e) => {
// Double click to zoom in
sdk.zoomIn();
});Context Menu
javascript
sdk.on("contextmenu", (e) => {
e.preventDefault();
// Show custom context menu
showContextMenu(e.lngLat);
});Mouse Hover
javascript
// Mouse enter
sdk.on("mouseenter", "airport", (e) => {
// Change cursor style
sdk.getCanvas().style.cursor = "pointer";
});
// Mouse leave
sdk.on("mouseleave", "airport", (e) => {
sdk.getCanvas().style.cursor = "";
});Mouse Move
javascript
sdk.on("mousemove", (e) => {
// Display mouse position in real-time
updateMousePosition(e.lngLat);
});Drag Interactions
Enable/Disable Drag
javascript
// Disable drag
sdk.dragPan.disable();
// Enable drag
sdk.dragPan.enable();Drag Events
javascript
sdk.on("dragstart", () => {
console.log("Drag started");
});
sdk.on("drag", () => {
console.log("Dragging");
});
sdk.on("dragend", () => {
console.log("Drag ended");
});Zoom Interactions
Mouse Wheel Zoom
javascript
// Disable wheel zoom
sdk.scrollZoom.disable();
// Enable wheel zoom
sdk.scrollZoom.enable();
// Listen to zoom events
sdk.on("zoom", () => {
console.log("Zoom level:", sdk.getZoom());
});
sdk.on("zoomstart", () => {
console.log("Zoom started");
});
sdk.on("zoomend", () => {
console.log("Zoom ended");
});Double Click Zoom
javascript
// Disable double click zoom
sdk.doubleClickZoom.disable();
// Enable double click zoom
sdk.doubleClickZoom.enable();Rotation Interactions
Enable/Disable Rotation
javascript
// Disable rotation (right-click drag)
sdk.dragRotate.disable();
// Enable rotation
sdk.dragRotate.enable();Rotation Events
javascript
sdk.on("rotate", () => {
console.log("Rotation angle:", sdk.getBearing());
});
sdk.on("rotatestart", () => {
console.log("Rotation started");
});
sdk.on("rotateend", () => {
console.log("Rotation ended");
});Keyboard Interactions
Enable/Disable Keyboard
javascript
// Disable keyboard control
sdk.keyboard.disable();
// Enable keyboard control
sdk.keyboard.enable();Keyboard Events
The SDK supports the following keyboard shortcuts by default:
+/-: Zoom←/→/↑/↓: PanShift + ←/Shift + →: Rotate
javascript
// Listen to keyboard events
document.addEventListener("keydown", (e) => {
if (e.key === "+" || e.key === "=") {
sdk.zoomIn();
} else if (e.key === "-") {
sdk.zoomOut();
}
});Touch Interactions (Mobile)
Touch Events
javascript
sdk.on("touchstart", (e) => {
console.log("Touch started");
});
sdk.on("touchmove", (e) => {
console.log("Touch moving");
});
sdk.on("touchend", (e) => {
console.log("Touch ended");
});Pinch Zoom
javascript
sdk.on("touchzoom", () => {
console.log("Pinch zoom");
});Feature Queries
Query Rendered Features
javascript
// Query features at click position
sdk.on("click", (e) => {
const features = sdk.queryRenderedFeatures(e.point);
console.log("Queried features:", features);
});
// Query features from specific layers
const features = sdk.queryRenderedFeatures(e.point, {
layers: ["airport", "airline"],
});
// Query features in a specific area
const boxFeatures = sdk.queryRenderedFeatures([
[x1, y1],
[x2, y2],
]);Query Source Data
javascript
// Query all features in source
const sourceFeatures = sdk.querySourceFeatures("airport-source", {
sourceLayer: "airport",
filter: ["==", "type", "civil"],
});Event Management
Add Event Listeners
javascript
// Add event listener
const handler = (e) => {
console.log("Event triggered:", e);
};
sdk.on("click", handler);Remove Event Listeners
javascript
// Remove specific listener
sdk.off("click", handler);
// Remove all listeners
sdk.off("click");One-time Event Listeners
javascript
// Listen only once
sdk.once("loadComplete", () => {
console.log("Map loaded (executed once)");
});Custom Interactions
Using ClickManager
javascript
// Show popup on click
sdk.clickObj.clickPopup(
"airport",
(feature) => {
return `<h3>${feature.properties.name}</h3>`;
},
{
anchor: "bottom",
closeButton: true,
}
);Using HoverManager
javascript
// Show information on hover
sdk.hover.hoverPopup(
"airport",
(feature) => {
return `<div>${feature.properties.name}</div>`;
},
{
anchor: "top",
}
);Using SelectFeature
javascript
// Enable feature selection
sdk.selector.enable({
onSelect: (feature, properties) => {
console.log("Selected feature:", feature);
},
isHighlight: true, // Highlight selected feature
isMultiSelect: false, // Whether to support multi-select
});
// Disable feature selection
sdk.selector.disable();
// Clear selection
sdk.selector.clearSelection();Complete Example
javascript
let sdk;
async function initMap() {
sdk = new navMap.MapSDK({
container: "map",
center: [116.39, 39.9],
zoom: 10,
});
sdk.on("loadComplete", () => {
setupInteractions();
});
}
function setupInteractions() {
// 1. Click to query features
sdk.on("click", (e) => {
const features = sdk.queryRenderedFeatures(e.point, {
layers: ["airport"],
});
if (features.length > 0) {
const feature = features[0];
showFeatureInfo(feature);
}
});
// 2. Hover highlight
sdk.on("mouseenter", "airport", (e) => {
sdk.getCanvas().style.cursor = "pointer";
highlightFeature(e.features[0]);
});
sdk.on("mouseleave", "airport", () => {
sdk.getCanvas().style.cursor = "";
clearHighlight();
});
// 3. Double click zoom
sdk.on("dblclick", (e) => {
sdk.flyTo({
center: e.lngLat,
zoom: sdk.getZoom() + 1,
duration: 500,
});
});
// 4. Context menu
sdk.on("contextmenu", (e) => {
e.preventDefault();
showContextMenu(e.lngLat);
});
// 5. Adjust layers on zoom
sdk.on("zoom", () => {
const zoom = sdk.getZoom();
if (zoom > 12) {
sdk.showLayers(["detail-layer"]);
} else {
sdk.hideLayers(["detail-layer"]);
}
});
// 6. Use selection manager
sdk.selector.enable({
onSelect: (feature) => {
console.log("Selected feature:", feature);
},
isHighlight: true,
});
}
function showFeatureInfo(feature) {
const popup = new navMap.Popup()
.setLngLat(feature.geometry.coordinates)
.setHTML(`<h3>${feature.properties.name}</h3>`)
.addTo(sdk.map);
}
initMap();Notes
- Event Order: Ensure event listeners are added after map
loadComplete - Performance Optimization: Avoid complex operations in frequently triggered events (such as
mousemove) - Event Cleanup: Remember to remove event listeners before page unload to avoid memory leaks
- Mobile Adaptation: Mobile devices should prioritize touch events over mouse events
