Skip to content

Commit 910c505

Browse files
Pass merge options when generating changeset
1 parent cfd6702 commit 910c505

File tree

5 files changed

+47
-17
lines changed

5 files changed

+47
-17
lines changed

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
writeOsmToPbfStream,
1616
type OsmChange,
1717
type OsmChanges,
18+
type OsmMergeOptions,
1819
} from "osm.ts"
1920
import { useCallback, useEffect, useRef, useState, useTransition } from "react"
2021
import Basemap from "../components/basemap"
@@ -55,8 +56,8 @@ export default function Merge() {
5556

5657
const [step, setStep] = useState<number>(1)
5758

58-
const [mergeOptions, setMergeOptions] = useState({
59-
simple: true,
59+
const [mergeOptions, setMergeOptions] = useState<OsmMergeOptions>({
60+
directMerge: true,
6061
deduplicateNodes: true,
6162
createIntersections: true,
6263
})
@@ -178,15 +179,18 @@ export default function Merge() {
178179
<b>DIRECT MERGE:</b> Add all new entities from the patch onto
179180
the base data set. Overwrite any entities that have matching
180181
IDs.
182+
<br />
183+
<span className="font-bold">Direct merge is required.</span>
181184
</p>
182185
<input
183186
type="checkbox"
184-
checked={mergeOptions.simple}
187+
disabled={true}
188+
checked={mergeOptions.directMerge}
185189
onChange={(e) => {
186190
const simple = e.currentTarget.checked
187191
setMergeOptions((m) => ({
188192
...m,
189-
simple,
193+
directMerge: simple,
190194
}))
191195
}}
192196
/>
@@ -237,6 +241,7 @@ export default function Merge() {
237241
const results = await osmWorker.generateChangeset(
238242
baseOsm.id,
239243
patchOsm.id,
244+
mergeOptions,
240245
)
241246
console.log(results)
242247
setChanges(results)

apps/osm-merge/src/workers/osm.worker.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
type GeoBbox2D,
66
type OsmChanges,
77
type OsmChangeset,
8+
type OsmMergeOptions,
89
type TileIndex,
910
} from "osm.ts"
1011
import * as Performance from "osm.ts/performance"
@@ -103,9 +104,14 @@ const osmWorker = {
103104
}
104105
},
105106
activeChangeset: null as OsmChangeset | null,
106-
generateChangeset(baseOsmId: string, patchOsmId: string): OsmChanges {
107+
generateChangeset(
108+
baseOsmId: string,
109+
patchOsmId: string,
110+
options: OsmMergeOptions,
111+
): OsmChanges {
107112
const changeset = this.osm(baseOsmId).generateChangeset(
108113
this.osm(patchOsmId),
114+
options,
109115
)
110116
this.activeChangeset = changeset
111117
return {

packages/osm.ts/src/changeset.ts

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ import type {
1212
} from "./types"
1313
import { entityPropertiesEqual, getEntityType } from "./utils"
1414

15+
export type OsmMergeOptions = {
16+
directMerge: boolean
17+
deduplicateNodes: boolean
18+
createIntersections: boolean
19+
}
20+
1521
export type OsmChangesStats = {
1622
deduplicatedNodes: number
1723
deduplicatedNodesReplaced: number
@@ -305,17 +311,26 @@ export default class OsmChangeset {
305311
}
306312
}
307313

308-
generateFullChangeset(patch: Osm) {
309-
this.generateDirectChanges(patch)
314+
generateFullChangeset(
315+
patch: Osm,
316+
{ directMerge, deduplicateNodes, createIntersections }: OsmMergeOptions,
317+
) {
318+
if (directMerge) {
319+
this.generateDirectChanges(patch)
320+
}
310321

311-
// Then de-duplicate overlapping nodes
312-
for (const node of patch.nodes) {
313-
this.deduplicateOverlappingNodes(node)
322+
if (deduplicateNodes) {
323+
// Then de-duplicate overlapping nodes
324+
for (const node of patch.nodes) {
325+
this.deduplicateOverlappingNodes(node)
326+
}
314327
}
315328

316-
// Then handle intersecting ways
317-
for (const way of patch.ways) {
318-
this.handleIntersectingWays(way, patch)
329+
if (createIntersections) {
330+
// Then handle intersecting ways
331+
for (const way of patch.ways) {
332+
this.handleIntersectingWays(way, patch)
333+
}
319334
}
320335
}
321336

packages/osm.ts/src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@ export { getEntityType } from "./utils"
1212
export { Nodes as NodeIndex } from "./nodes"
1313
export { createOsmIndexFromPbfData } from "./osm-from-pbf"
1414
export { writeOsmToPbfStream } from "./osm-to-pbf"
15-
export { default as OsmChangeset, type OsmChanges } from "./changeset"
15+
export {
16+
default as OsmChangeset,
17+
type OsmChanges,
18+
type OsmMergeOptions,
19+
} from "./changeset"

packages/osm.ts/src/osm.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import type {
2222
import { isNode, isRelation, isWay } from "./utils"
2323
import { Ways, type WaysTransferables } from "./ways"
2424
import { IdArrayType } from "./typed-arrays"
25-
import OsmChangeset from "./changeset"
25+
import OsmChangeset, { type OsmMergeOptions } from "./changeset"
2626

2727
export interface OsmTransferables {
2828
id: string
@@ -297,9 +297,9 @@ export class Osm {
297297
return this.nodes.bbox ?? this.headerBbox()
298298
}
299299

300-
generateChangeset(other: Osm) {
300+
generateChangeset(other: Osm, options: OsmMergeOptions) {
301301
const changeset = new OsmChangeset(this)
302-
changeset.generateFullChangeset(other)
302+
changeset.generateFullChangeset(other, options)
303303
return changeset
304304
}
305305
}

0 commit comments

Comments
 (0)