Skip to content

Commit cfd6702

Browse files
Show selected entity on map
1 parent 8d27132 commit cfd6702

File tree

4 files changed

+53
-4
lines changed

4 files changed

+53
-4
lines changed

apps/osm-merge/src/hooks/map.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ export function useBitmapTileLayer(osm?: Osm | null) {
8787
export function usePickableOsmTileLayer(osm?: Osm | null) {
8888
const startTask = useStartTask()
8989
const osmWorker = useOsmWorker()
90+
9091
const [selectedEntity, setSelectedEntity] = useAtom(selectedEntityAtom)
9192
const layer = useMemo(() => {
9293
const bbox = osm?.bbox()
@@ -266,6 +267,26 @@ export function usePickableOsmTileLayer(osm?: Osm | null) {
266267

267268
return {
268269
layer,
270+
setSelectedEntity,
269271
selectedEntity,
270272
}
271273
}
274+
275+
export function useSelectedEntityLayer(osm?: Osm | null) {
276+
const selectedEntity = useAtomValue(selectedEntityAtom)
277+
return useMemo(() => {
278+
if (!osm || !selectedEntity) return null
279+
const geojson = osm.getEntityGeoJson(selectedEntity)
280+
return new GeoJsonLayer({
281+
id: `${APPID}:selected-entity`,
282+
data: geojson,
283+
getLineColor: [255, 0, 0, 255],
284+
getLineWidth: 3,
285+
pointRadiusMinPixels: 2,
286+
pointRadiusMaxPixels: 10,
287+
lineWidthMinPixels: 2,
288+
lineWidthMaxPixels: 10,
289+
filled: false,
290+
})
291+
}, [osm, selectedEntity])
292+
}

apps/osm-merge/src/pages/inspect.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { usePickableOsmTileLayer } from "@/hooks/map"
1+
import { usePickableOsmTileLayer, useSelectedEntityLayer } from "@/hooks/map"
22
import { useOsmFile } from "@/hooks/osm"
33
import { APPID, MIN_PICKABLE_ZOOM } from "@/settings"
44
import { addLogMessageAtom } from "@/state/log"
@@ -45,6 +45,7 @@ export default function ViewPage() {
4545
}, [file])
4646

4747
const { layer: tileLayer, selectedEntity } = usePickableOsmTileLayer(osm)
48+
const selectedEntityLayer = useSelectedEntityLayer(osm)
4849

4950
return (
5051
<Main>
@@ -128,7 +129,7 @@ export default function ViewPage() {
128129
</Source>
129130
)}
130131
<DeckGlOverlay
131-
layers={[tileLayer]}
132+
layers={[tileLayer, selectedEntityLayer]}
132133
pickingRadius={5}
133134
getTooltip={(pickingInfo) => {
134135
const sourceLayerId = pickingInfo.sourceLayer?.id

apps/osm-merge/src/pages/merge.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import useStartTask from "@/hooks/log"
2-
import { useBitmapTileLayer, usePickableOsmTileLayer } from "@/hooks/map"
2+
import {
3+
useBitmapTileLayer,
4+
usePickableOsmTileLayer,
5+
useSelectedEntityLayer,
6+
} from "@/hooks/map"
37
import { useOsmFile, useOsmWorker } from "@/hooks/osm"
48
import { APPID, DEFAULT_BASE_PBF_URL, DEFAULT_PATCH_PBF_URL } from "@/settings"
59
import { mapAtom } from "@/state/map"
@@ -47,6 +51,8 @@ export default function Merge() {
4751
const { layer: mergedTileLayer, selectedEntity: mergedSelectedEntity } =
4852
usePickableOsmTileLayer(mergedOsm)
4953

54+
const selectedEntityLayer = useSelectedEntityLayer(mergedOsm)
55+
5056
const [step, setStep] = useState<number>(1)
5157

5258
const [mergeOptions, setMergeOptions] = useState({
@@ -350,7 +356,12 @@ export default function Merge() {
350356
<MapContent>
351357
<Basemap>
352358
<DeckGlOverlay
353-
layers={[baseTileLayer, patchTileLayer, mergedTileLayer]}
359+
layers={[
360+
baseTileLayer,
361+
patchTileLayer,
362+
mergedTileLayer,
363+
selectedEntityLayer,
364+
]}
354365
getTooltip={(pickingInfo) => {
355366
const sourceLayerId = pickingInfo.sourceLayer?.id
356367
if (sourceLayerId?.startsWith(`${APPID}:${mergedOsm?.id}`)) {

packages/osm.ts/src/osm.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import type {
1616
OsmEntityTypeMap,
1717
OsmNode,
1818
OsmRelation,
19+
OsmTags,
1920
OsmWay,
2021
} from "./types"
2122
import { isNode, isRelation, isWay } from "./utils"
@@ -258,6 +259,21 @@ export class Osm {
258259
throw new Error("Unknown entity type")
259260
}
260261

262+
getEntityGeoJson(
263+
entity: OsmNode | OsmWay | OsmRelation,
264+
): GeoJSON.Feature<GeoJSON.Geometry, OsmTags> {
265+
if (isNode(entity)) {
266+
return nodeToFeature(entity)
267+
}
268+
if (isWay(entity)) {
269+
return wayToFeature(entity, this.nodes)
270+
}
271+
if (isRelation(entity)) {
272+
return relationToFeature(entity, this.nodes)
273+
}
274+
throw new Error("Unknown entity type")
275+
}
276+
261277
createNode(lonLat: LonLat) {
262278
const maxNodeId = this.nodes.ids.at(-1) ?? 0
263279
return this.nodes.addNode({

0 commit comments

Comments
 (0)