set but don't read tile inspector hash state; store max extent

This commit is contained in:
Brandon Liu
2022-12-14 11:04:59 +08:00
parent 9a79970851
commit 25088aaccf
2 changed files with 46 additions and 11 deletions

View File

@@ -7,9 +7,7 @@ import { VectorTile, VectorTileFeature } from "@mapbox/vector-tile";
import { path } from "d3-path"; import { path } from "d3-path";
import { schemeSet3 } from "d3-scale-chromatic"; import { schemeSet3 } from "d3-scale-chromatic";
import { useMeasure } from "react-use"; import { useMeasure } from "react-use";
import { import { UncontrolledReactSVGPanZoom } from "react-svg-pan-zoom";
UncontrolledReactSVGPanZoom,
} from "react-svg-pan-zoom";
const TableContainer = styled("div", { const TableContainer = styled("div", {
height: "calc(100vh - $4 - $4)", height: "calc(100vh - $4 - $4)",
@@ -19,22 +17,22 @@ const TableContainer = styled("div", {
const SVGContainer = styled("div", { const SVGContainer = styled("div", {
width: "100%", width: "100%",
height: "calc(100vh - $4 - $4)" height: "calc(100vh - $4 - $4)",
}) });
const Table = styled("table", { const Table = styled("table", {
padding: "$2", padding: "$2",
}); });
const Pane = styled("div", { const Pane = styled("div", {
width: "calc(100%/3*2)" width: "calc(100%/3*2)",
}); });
const TableRow = styled( const TableRow = styled(
"tr", "tr",
{ {
cursor: "pointer", cursor: "pointer",
fontFamily: "monospace" fontFamily: "monospace",
}, },
{ "&:hover": { color: "red" } } { "&:hover": { color: "red" } }
); );
@@ -45,7 +43,7 @@ const Split = styled("div", {
const TileRow = (props: { const TileRow = (props: {
entry: Entry; entry: Entry;
setSelectedEntry: Dispatch<SetStateAction<Entry | null>>; setSelectedEntry:(val: Entry | null) => void;
}) => { }) => {
let [z, x, y] = tileIdToZxy(props.entry.tileId); let [z, x, y] = tileIdToZxy(props.entry.tileId);
return ( return (
@@ -179,6 +177,7 @@ const VectorPreview = (props: {
tileType: TileType; tileType: TileType;
}) => { }) => {
let [layers, setLayers] = useState<Layer[]>([]); let [layers, setLayers] = useState<Layer[]>([]);
let [maxExtent, setMaxExtent] = useState<number>(0);
let [selectedFeature, setSelectedFeature] = useState<Feature | null>(null); let [selectedFeature, setSelectedFeature] = useState<Feature | null>(null);
const Viewer = useRef<UncontrolledReactSVGPanZoom>(null); const Viewer = useRef<UncontrolledReactSVGPanZoom>(null);
const [ref, { width, height }] = useMeasure<HTMLDivElement>(); const [ref, { width, height }] = useMeasure<HTMLDivElement>();
@@ -194,7 +193,11 @@ const VectorPreview = (props: {
let tile = new VectorTile(new Protobuf(new Uint8Array(resp!.data))); let tile = new VectorTile(new Protobuf(new Uint8Array(resp!.data)));
let newLayers = []; let newLayers = [];
let max_extent = 0;
for (let [name, layer] of Object.entries(tile.layers)) { for (let [name, layer] of Object.entries(tile.layers)) {
if (layer.extent > max_extent) {
max_extent = layer.extent;
}
let features: Feature[] = []; let features: Feature[] = [];
for (var i = 0; i < layer.length; i++) { for (var i = 0; i < layer.length; i++) {
let feature = layer.feature(i); let feature = layer.feature(i);
@@ -228,6 +231,7 @@ const VectorPreview = (props: {
} }
newLayers.push({ features: features, name: name }); newLayers.push({ features: features, name: name });
} }
setMaxExtent(max_extent);
newLayers.sort(smartCompare); newLayers.sort(smartCompare);
setLayers(newLayers); setLayers(newLayers);
}; };
@@ -285,11 +289,42 @@ const RasterPreview = (props: { file: PMTiles; entry: Entry }) => {
return <img src={imgSrc}></img>; return <img src={imgSrc}></img>;
}; };
function getHashString(entry:Entry) {
const [z,x,y] = tileIdToZxy(entry.tileId);
let hash = `${z}/${x}/${y}`;
const hashName = "inspector";
let found = false;
const parts = window.location.hash
.slice(1)
.split("&")
.map((part) => {
const key = part.split("=")[0];
if (key === hashName) {
found = true;
return `${key}=${hash}`;
}
return part;
})
.filter((a) => a);
if (!found) {
parts.push(`${hashName}=${hash}`);
}
return `#${parts.join("&")}`;
}
function Inspector(props: { file: PMTiles }) { function Inspector(props: { file: PMTiles }) {
let [entryRows, setEntryRows] = useState<Entry[]>([]); let [entryRows, setEntryRows] = useState<Entry[]>([]);
let [selectedEntry, setSelectedEntry] = useState<Entry | null>(null); let [selectedEntry, setSelectedEntryRaw] = useState<Entry | null>(null);
let [header, setHeader] = useState<Header | null>(null); let [header, setHeader] = useState<Header | null>(null);
function setSelectedEntry(val: Entry | null) {
if (val && val.runLength > 0) {
window.history.replaceState(window.history.state, "", getHashString(val));
}
setSelectedEntryRaw(val);
}
useEffect(() => { useEffect(() => {
let fn = async () => { let fn = async () => {
let header = await props.file.getHeader(); let header = await props.file.getHeader();

View File

@@ -144,7 +144,7 @@ function MaplibreMap(props: { file: PMTiles }) {
map = new maplibregl.Map({ map = new maplibregl.Map({
container: mapContainerRef.current!, container: mapContainerRef.current!,
hash: true, hash: "map",
zoom: 0, zoom: 0,
center: [0, 0], center: [0, 0],
style: { style: {