import React from "react"; import type { GeoJSONFeatureWithSourceLayer } from "@maplibre/maplibre-gl-inspect"; export type InspectFeature = GeoJSONFeatureWithSourceLayer & { inspectModeCounter?: number counter?: number }; function displayValue(value: string | number | Date | object | undefined) { if (typeof value === "undefined" || value === null) return value; if (value instanceof Date) return value.toLocaleString(); if (typeof value === "object" || typeof value === "number" || typeof value === "string") return value.toString(); return value; } function renderKeyValueTableRow(key: string, value: string | undefined) { return {key} {value} ; } function renderFeature(feature: InspectFeature, idx: number) { return {feature.layer["source"]}: {feature.layer["source-layer"]}{feature.inspectModeCounter && × {feature.inspectModeCounter}} {renderKeyValueTableRow("$type", feature.geometry.type)} {renderKeyValueTableRow("$id", displayValue(feature.id))} {Object.keys(feature.properties).map(propertyName => { const property = feature.properties[propertyName]; return renderKeyValueTableRow(propertyName, displayValue(property)); })} ; } function removeDuplicatedFeatures(features: InspectFeature[]) { const uniqueFeatures: InspectFeature[] = []; features.forEach(feature => { const featureIndex = uniqueFeatures.findIndex(feature2 => { return feature.layer["source-layer"] === feature2.layer["source-layer"] && JSON.stringify(feature.properties) === JSON.stringify(feature2.properties); }); if(featureIndex === -1) { uniqueFeatures.push(feature); } else { if("inspectModeCounter" in uniqueFeatures[featureIndex]) { uniqueFeatures[featureIndex].inspectModeCounter!++; } else { uniqueFeatures[featureIndex].inspectModeCounter = 2; } } }); return uniqueFeatures; } type FeaturePropertyPopupProps = { features: InspectFeature[] }; class FeaturePropertyPopup extends React.Component { render() { const features = removeDuplicatedFeatures(this.props.features); return
{features.map(renderFeature)}
; } } export default FeaturePropertyPopup;