Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
b7c4165
started working on boundaries for building pois
dgraf-gh Mar 28, 2026
e3e35e4
feat: add methods for tracking buildings in import statistics
dgraf-gh Mar 28, 2026
9f87b02
feat: implement building statistics tracking and reporting
dgraf-gh Mar 28, 2026
a6684c9
feat: add new building-related getter methods to ImportStatistics
dgraf-gh Mar 28, 2026
f3d599c
started working on boundaries for building pois
dgraf-gh Mar 28, 2026
1cf9d12
started working on boundaries for building pois
dgraf-gh Mar 28, 2026
935f754
fix: update phase matching in ImportStatistics to correctly report no…
dgraf-gh Mar 28, 2026
5cae5d3
fix: update phase matching conditions for import statistics logging
dgraf-gh Mar 28, 2026
e0402df
feat: optimize building processing and filter out natural features
dgraf-gh Mar 28, 2026
293f598
fix: remove unsupported method call in ImportService
dgraf-gh Mar 28, 2026
075ca8a
feat: Improve building boundary processing with memory-efficient stre…
dgraf-gh Mar 28, 2026
6d49186
started working on boundaries for building pois
dgraf-gh Mar 28, 2026
b33c126
feat: add building service and enhance POI response with building info
dgraf-gh Mar 28, 2026
9c6c358
feat: add building info enhancement method to POI response
dgraf-gh Mar 28, 2026
95f33e4
started working on boundaries for building pois
dgraf-gh Mar 29, 2026
f912d5f
refactor: Adjust building import process to use append-only and shard…
dgraf-gh Mar 29, 2026
17cbf29
feat: add building compaction phase with updated import statistics an…
dgraf-gh Mar 29, 2026
fbb3555
refactor: rename buildings database to buildings_shards
dgraf-gh Mar 29, 2026
3a92cd7
started working on boundaries for building pois
dgraf-gh Mar 29, 2026
18c08cf
refactor: add progress tracking for POI index scanning phase
dgraf-gh Mar 29, 2026
9340ba0
refactor: modify getBuildingInfo to use point-in-polygon geometry check
dgraf-gh Mar 29, 2026
1870100
started working on boundaries for building pois
dgraf-gh Mar 30, 2026
927460f
cleanup
dgraf-gh Mar 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions schema/building.fbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace com.dedicatedcode.paikka.flatbuffers;

table Geometry {
data:[ubyte]; // WKB binary
}
table Building {
id: long;
name: string; // building type (residential, commercial, etc.)
code: string; // always "building"
geometry: Geometry;
}

table BuildingList {
buildings: [Building];
}

root_type BuildingList;
5 changes: 3 additions & 2 deletions scripts/filter_osm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ echo "Input file: $INPUT_FILE"
echo "Output file: $OUTPUT_FILE"
echo ""
osmium tags-filter "$INPUT_FILE" \
nwr/amenity!=bench,drinking_water,waste_basket,bicycle_parking,vending_machine,parking_entrance,fire_hydrant,recycling \
nwr/emergency!=fire_hydrant,defibrillator \
nwr/amenity!=bench,drinking_water,waste_basket,bicycle_parking,vending_machine,parking_entrance,fire_hydrant,recycling,post_box,atm,loading_ramp,parcel_locker,trolley_bay \
nwr/emergency!=fire_hydrant,defibrillator,fire_service_inlet \
nw/shop \
nw/tourism \
nw/leisure \
Expand All @@ -70,6 +70,7 @@ osmium tags-filter "$INPUT_FILE" \
w/building=yes,commercial,retail,industrial,office,apartments,residential \
r/boundary=administrative \
r/type=multipolygon \
n/addr:* \
-o "$OUTPUT_FILE" --overwrite

if [ $? -eq 0 ]; then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.dedicatedcode.paikka.service.ReverseGeocodingService;
import com.dedicatedcode.paikka.service.BoundaryService;
import com.dedicatedcode.paikka.service.MetadataService;
import com.dedicatedcode.paikka.service.BuildingService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
Expand All @@ -44,11 +45,16 @@ public class AdminController {
private final ReverseGeocodingService reverseGeocodingService;
private final BoundaryService boundaryService;
private final MetadataService metadataService;
private final BuildingService buildingService;

public AdminController(ReverseGeocodingService reverseGeocodingService, BoundaryService boundaryService, MetadataService metadataService) {
public AdminController(ReverseGeocodingService reverseGeocodingService,
BoundaryService boundaryService,
MetadataService metadataService,
BuildingService buildingService) {
this.reverseGeocodingService = reverseGeocodingService;
this.boundaryService = boundaryService;
this.metadataService = metadataService;
this.buildingService = buildingService;
}

@PostMapping(value = "/refresh-db", produces = "application/json")
Expand All @@ -64,6 +70,10 @@ public ResponseEntity<?> refreshDatabase() {
logger.info("Reloading boundaries database...");
boundaryService.reloadDatabase();

// Reload the building service (buildings database)
logger.info("Reloading buildings database...");
buildingService.reloadDatabase();

// Reload metadata
logger.info("Reloading metadata...");
metadataService.reload();
Expand Down
58 changes: 58 additions & 0 deletions src/main/java/com/dedicatedcode/paikka/flatbuffers/Building.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// automatically generated by the FlatBuffers compiler, do not modify

package com.dedicatedcode.paikka.flatbuffers;

import java.nio.*;
import java.lang.*;
import java.util.*;
import com.google.flatbuffers.*;

@SuppressWarnings("unused")
public final class Building extends Table {
public static void ValidateVersion() { Constants.FLATBUFFERS_25_2_10(); }
public static Building getRootAsBuilding(ByteBuffer _bb) { return getRootAsBuilding(_bb, new Building()); }
public static Building getRootAsBuilding(ByteBuffer _bb, Building obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
public Building __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }

public long id() { int o = __offset(4); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
public String name() { int o = __offset(6); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(6, 1); }
public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 6, 1); }
public String code() { int o = __offset(8); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer codeAsByteBuffer() { return __vector_as_bytebuffer(8, 1); }
public ByteBuffer codeInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 8, 1); }
public com.dedicatedcode.paikka.flatbuffers.Geometry geometry() { return geometry(new com.dedicatedcode.paikka.flatbuffers.Geometry()); }
public com.dedicatedcode.paikka.flatbuffers.Geometry geometry(com.dedicatedcode.paikka.flatbuffers.Geometry obj) { int o = __offset(10); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }

public static int createBuilding(FlatBufferBuilder builder,
long id,
int nameOffset,
int codeOffset,
int geometryOffset) {
builder.startTable(4);
Building.addId(builder, id);
Building.addGeometry(builder, geometryOffset);
Building.addCode(builder, codeOffset);
Building.addName(builder, nameOffset);
return Building.endBuilding(builder);
}

public static void startBuilding(FlatBufferBuilder builder) { builder.startTable(4); }
public static void addId(FlatBufferBuilder builder, long id) { builder.addLong(0, id, 0L); }
public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(1, nameOffset, 0); }
public static void addCode(FlatBufferBuilder builder, int codeOffset) { builder.addOffset(2, codeOffset, 0); }
public static void addGeometry(FlatBufferBuilder builder, int geometryOffset) { builder.addOffset(3, geometryOffset, 0); }
public static int endBuilding(FlatBufferBuilder builder) {
int o = builder.endTable();
return o;
}

public static final class Vector extends BaseVector {
public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }

public Building get(int j) { return get(new Building(), j); }
public Building get(Building obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// automatically generated by the FlatBuffers compiler, do not modify

package com.dedicatedcode.paikka.flatbuffers;

import java.nio.*;
import java.lang.*;
import java.util.*;
import com.google.flatbuffers.*;

@SuppressWarnings("unused")
public final class BuildingList extends Table {
public static void ValidateVersion() { Constants.FLATBUFFERS_25_2_10(); }
public static BuildingList getRootAsBuildingList(ByteBuffer _bb) { return getRootAsBuildingList(_bb, new BuildingList()); }
public static BuildingList getRootAsBuildingList(ByteBuffer _bb, BuildingList obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
public BuildingList __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }

public com.dedicatedcode.paikka.flatbuffers.Building buildings(int j) { return buildings(new com.dedicatedcode.paikka.flatbuffers.Building(), j); }
public com.dedicatedcode.paikka.flatbuffers.Building buildings(com.dedicatedcode.paikka.flatbuffers.Building obj, int j) { int o = __offset(4); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
public int buildingsLength() { int o = __offset(4); return o != 0 ? __vector_len(o) : 0; }
public com.dedicatedcode.paikka.flatbuffers.Building.Vector buildingsVector() { return buildingsVector(new com.dedicatedcode.paikka.flatbuffers.Building.Vector()); }
public com.dedicatedcode.paikka.flatbuffers.Building.Vector buildingsVector(com.dedicatedcode.paikka.flatbuffers.Building.Vector obj) { int o = __offset(4); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }

public static int createBuildingList(FlatBufferBuilder builder,
int buildingsOffset) {
builder.startTable(1);
BuildingList.addBuildings(builder, buildingsOffset);
return BuildingList.endBuildingList(builder);
}

public static void startBuildingList(FlatBufferBuilder builder) { builder.startTable(1); }
public static void addBuildings(FlatBufferBuilder builder, int buildingsOffset) { builder.addOffset(0, buildingsOffset, 0); }
public static int createBuildingsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
public static void startBuildingsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
public static int endBuildingList(FlatBufferBuilder builder) {
int o = builder.endTable();
return o;
}
public static void finishBuildingListBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset); }
public static void finishSizePrefixedBuildingListBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset); }

public static final class Vector extends BaseVector {
public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }

public BuildingList get(int j) { return get(new BuildingList(), j); }
public BuildingList get(BuildingList obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
}
}

Loading
Loading