Permanent ID/Proposal-QID

From OpenStreetMap Wiki
Jump to navigation Jump to search

All important Map Feature in the OSM can be assigned to a Wikidata Item (by key:wikidata), that is an unique and "eternal" identifier. It is a positive integer number, for example the country Brazil is identified by the number 155. To avoid confusion with other Wikidata identifiers, a letter "Q" prefix was adopted, so Q155 is the unique and "eternal" identifier of the country Brazil.

In July 2018 there are:

~1,125,000 OSM elements with a wikidata key.
(there are many elements representing same feature — e.g. a relation and a node representing the same building).
~63,000 OSM features (represented by relations) with Wikidata reciprocal use.
Each feature having a permanent Wikidata ID, and a statement OSM relation ID (P402) pointing to the OSM online map.

Proposal to redirect Wikidata identifier

Redirect Wikidata item "Q" identifiers by$1 to the respective geometry. Examples:

  • Relation. The Wikidata item that represents the concept of the country Brazil (Q155), on OSM is a relation, will redirect to
  • Way. The Wikidata item that represents the concept of the Fraternity Bridge (Q2679759), on OSM is a way, will redirect to
  • Node. Wikidata item of the Number zero survey marker of the city of São Paulo, (Q10325364), on OSM is a node, will redirect to

To use the OSM.ORG is also subject of discussion, please see

Proof of concept and basic implementation

Using the above examples:

The redirect minimal algorithm depends on a simple lookup table of 64-bit integers, a lightweight database and conversion function:

CREATE TABLE wd_osm_minimal (
  wd_id bigint NOT NULL PRIMARY KEY, -- the Wikidata Q-id
  osm_type char(1) NOT NULL,         -- the element-type (n=node,w=way,r=relation,e=err)
  osm_id bigint NOT NULL,            -- the OSM uniqueID at osm_type namespace

CREATE FUNCTION wdosm.osm_url(p_osm_type char, p_id bigint) RETURNS text AS $f$
    -- includes an error handler to help user to fix a wd_id attribution error
    SELECT concat(
         CASE WHEN $1='e' THEN '' 
              ELSE '' END
        ,CASE WHEN $1='w' THEN 'way' 
              WHEN $1='r' THEN 'relation' 
              WHEN $1='n' THEN 'node' 
              ELSE 'error' END
$f$ language SQL IMMUTABLE;

At HTTP server, eg. Nginx, the rewrite engine is based on the regular expression "^[qQ](\d+)$", that reacts only to Wikidata Q-id, preserving other alternative uses to the domain.