Populate a MongoDB collection with OpenStreetMap data
C++ C
Latest commit 6578356 Sep 11, 2011 Andreas Kalsch Add bin dir
Failed to load latest commit information.
bin Add bin dir Sep 10, 2011
src Indentation: tabs Sep 10, 2011
.gitignore First commit Sep 10, 2011
DEPENDENCY First commit Sep 10, 2011
README First commit Sep 10, 2011
TODO First commit Sep 10, 2011
makefile First commit Sep 10, 2011

README

osmo: Populate a MongoDB collection with OpenStreetMap data


Features

- osmo populates a MongoDB database collection with all nodes, ways and relations
- Currently, only OSM XML (.osm) is supported
- It's just slightly slower than Osmosis (with Postgres)
- Prerequisites: see DEPENDENCY
- Building:

	make

	(A priority is it to make this work in both Mac OS and Linux!)

- Synopsis:

	bin/osmo DATAFILE DATABASE.COLLECTION

- To add an index on the primary key:

	mongo DATABASE --eval \
"printjson(db.COLLECTION.ensureIndex({ p: 1, id: 1 }, { unique: true, dropDups: true, background: true }))"


Data model

The data model supported by osmo is focussed on minimal data size and unification. Some principles:

- nodes, ways and relations are transformed to GeoObject instances to unify the concept and to simplify queries on only 1 collection
- Every geoObject has a key named "p" (prefix). It can have the values, "n" (node), "w" (way) or "r" (relation).
- keys for regular fields (user, timestamp, ...) are abbreviated to save space
- The geoObject primary key is [ 'p', 'id' ]
- Example for a GeoObject instance:

	{
		"_id" : ObjectId("4e3213dbe9b522a655e3f5ff"),
		"c" : 4977984,
		"id" : 318214,
		"p" : "r",
		"parts" : { 
			"list" : [
				{
					"p" : "n",
					"id" : 319621296
				},
				{
					"p" : "n",
					"id" : 560090559
				},
				{
					"p" : "n",
					"id" : 292635574
				},
				{
					"p" : "n",
					"id" : 292635576
				},
				{
					"p" : "n",
					"id" : 245431191
				},
				{
					"p" : "w",
					"id" : 48289915
				},
				{
					"p" : "w",
					"id" : 49366289
				},
				...
			],
			"info" : [
				{
					"role" : "forward"
				},
				{
					"role" : "forward"
				},
				{
					"role" : ""
				},
				{
					"role" : "forward"
				},
				{
					"role" : ""
				},
				{
					"role" : "forward"
				},
				{
					"role" : "forward"
				},
				...
			]
		}, 
		"t" : 1276427410,
		"tags" : { 
			"network" : "VRT",
			"operator" : "SWT",
			"ref" : "4",
			"route" : "bus",
			"type" : "route"
		}, 
		"u" : { 
			"id" : 109925,
			"name" : "WanMil"
		}, 
		"v" : 6
	}

- "parts" is an ObjectView object that has always two properties: "list" (a list of GeoObject references) and "info" (that optionally holds information about the referenced objects in the same order). GeoObjects with p=n do not have parts, with p=w, parts are always references to nodes, with p=r parts can reference any type (node, way, relation).


Contribute

Take a look at TODO to see a list of priorized features that are still lacking.