Skip to content

Commit

Permalink
first draft at a simple indoor import
Browse files Browse the repository at this point in the history
  • Loading branch information
CommanderStorm committed Aug 12, 2024
1 parent 7009b88 commit 48911f5
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 77 deletions.
15 changes: 6 additions & 9 deletions docker-compose.local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,17 +84,14 @@ services:
test: [ "CMD", "pg_isready", "-U", "${POSTGRES_USER}" ]
retries: 5
interval: 10s
start_period: 10s
start_interval: 20s
start_period: 20s
osm-download-data:
image: alpine:latest
command:
- wget
- -O
- data.pbf
- https://download.geofabrik.de/europe/germany/bayern/oberbayern-latest.osm.pbf
working_dir: /data
command: sh -c "apk add wget && wget --continue --timestamping https://download.geofabrik.de/europe/germany/bayern/oberbayern-latest.osm.pbf"
working_dir: /map/data
volumes:
- ./map/data/:/data/:rw
- ./map/data/:/map/data/:rw
osm2pgsql-init:
image: iboates/osm2pgsql:latest
environment:
Expand All @@ -114,7 +111,7 @@ services:
- db
- --port
- "5432"
- /map/data/data.pbf
- /map/data/oberbayern-latest.osm.pbf
- --output=flex
- --style
- /map/osm2pgsql/style.lua
Expand Down
12 changes: 4 additions & 8 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -191,14 +191,10 @@ services:
start_period: 10s
osm-download-data:
image: alpine:latest
command:
- wget
- -O
- data.pbf
- https://download.geofabrik.de/europe/germany-latest.osm.pbf
working_dir: /data
command: apk --update add wget && wget --continue --timestamping https://download.geofabrik.de/europe/germany-latest.osm.pbf
working_dir: /map/data
volumes:
- ./map/data/:/data/:rw
- ./map/data/:/map/data/:rw
osm2pgsql-init:
image: iboates/osm2pgsql:latest
networks:
Expand All @@ -220,7 +216,7 @@ services:
- db
- --port
- "5432"
- /map/data/data.pbf
- /map/data/germany-latest.osm.pbf
- --output=flex
- --style
- /map/osm2pgsql/style.lua
Expand Down
85 changes: 25 additions & 60 deletions map/osm2pgsql/style.lua
Original file line number Diff line number Diff line change
@@ -1,60 +1,26 @@
-- This config exmple file is released into the Public Domain.

-- This is a very simple Lua config for the Flex output not intended for
-- real-world use. Use it do understand the basic principles of the
-- configuration. After reading and understanding this, have a look at
-- "geometries.lua".
-- See https://github.com/osm2pgsql-dev/osm2pgsql/tree/master/flex-config
-- for configuration examples

-- For debugging
-- inspect = require('inspect')
-- print(inspect(object))

-- The global variable "osm2pgsql" is used to talk to the main osm2pgsql code.
-- You can, for instance, get the version of osm2pgsql:
print('osm2pgsql version: ' .. osm2pgsql.version)

-- A place to store the SQL tables we will define shortly.
local tables = {}

-- Create a new table called "pois" with the given columns. When running in
-- "create" mode, this will do the `CREATE TABLE`, when running in "append"
-- mode, this will only declare the table for use.
--
-- This is a "node table", it can only contain data derived from nodes and will
-- contain a "node_id" column (SQL type INT8) as first column. When running in
-- "append" mode, osm2pgsql will automatically update this table using the node
-- ids.
tables.pois = osm2pgsql.define_node_table('pois', {
{ column = 'tags', type = 'jsonb' },
{ column = 'geom', type = 'point', not_null = true }, -- will be something like `GEOMETRY(Point, 4326)` in SQL
})

-- A special table for restaurants to demonstrate that we can have any tables
-- with any columns we want.
tables.restaurants = osm2pgsql.define_node_table('restaurants', {
{ column = 'name', type = 'text' },
{ column = 'cuisine', type = 'text' },
-- We declare all geometry columns as "NOT NULL". If osm2pgsql encounters
-- an invalid geometry (for whatever reason) it will generate a null
-- geometry which will not be written to the database if "not_null" is
-- set. The result is that broken geometries will just be silently
-- ignored.
tables.indoor_nodes = osm2pgsql.define_node_table('indoor_nodes', {
{ column = 'tags', type = 'jsonb' },
{ column = 'geom', type = 'point', not_null = true },
})

-- This is a "way table", it can only contain data derived from ways and will
-- contain a "way_id" column. When running in "append" mode, osm2pgsql will
-- automatically update this table using the way ids.
tables.ways = osm2pgsql.define_way_table('ways', {
tables.indoor_ways = osm2pgsql.define_way_table('indoor_ways', {
{ column = 'tags', type = 'jsonb' },
{ column = 'geom', type = 'linestring', not_null = true },
})

-- This is an "area table", it can contain data derived from ways or relations
-- and will contain an "area_id" column. Way ids will be stored "as is" in the
-- "area_id" column, for relations the negative id will be stored. When
-- running in "append" mode, osm2pgsql will automatically update this table
-- using the way/relation ids.
tables.polygons = osm2pgsql.define_area_table('polygons', {
tables.indoor_polygons = osm2pgsql.define_area_table('indoor_polygons', {
{ column = 'type', type = 'text' },
{ column = 'tags', type = 'jsonb' },
-- The type of the `geom` column is `geometry`, because we need to store
Expand Down Expand Up @@ -91,23 +57,14 @@ function osm2pgsql.process_node(object)
return
end

if object.tags.amenity == 'restaurant' then
-- Add a row to the SQL table. The keys in the parameter table
-- correspond to the table columns, if one is missing the column will
-- be NULL. Id and geometry columns will be filled automatically.
tables.restaurants:insert({
name = object.tags.name,
cuisine = object.tags.cuisine,
geom = object:as_point()
})
else
tables.pois:insert({
-- We know `tags` is of type `jsonb` so this will do the
-- right thing.
tags = object.tags,
geom = object:as_point()
})
if object.tags.indoor == nil and object.tags.level == nil then
return
end

tables.indoor_nodes:insert({
tags = object.tags,
geom = object:as_point()
})
end

-- Called for every way in the input. The `object` argument contains the same
Expand All @@ -121,16 +78,20 @@ function osm2pgsql.process_way(object)
return
end

if object.tags.indoor == nil and object.tags.level == nil then
return
end

-- Very simple check to decide whether a way is a polygon or not, in a
-- real stylesheet we'd have to also look at the tags...
if object.is_closed then
tables.polygons:insert({
tables.indoor_polygons:insert({
type = object.type,
tags = object.tags,
geom = object:as_polygon()
})
else
tables.ways:insert({
tables.indoor_ways:insert({
tags = object.tags,
geom = object:as_linestring()
})
Expand All @@ -148,10 +109,14 @@ function osm2pgsql.process_relation(object)
return
end

if object.tags.indoor == nil and object.tags.level == nil then
return
end

-- Store multipolygons and boundaries as polygons
if object.tags.type == 'multipolygon' or
object.tags.type == 'boundary' then
tables.polygons:insert({
tables.indoor_polygons:insert({
type = object.type,
tags = object.tags,
geom = object:as_multipolygon()
Expand Down

0 comments on commit 48911f5

Please sign in to comment.