Re: [OSM-dev] Questions on Nominatim and administrative boundaries + osm2pgsql

2009-12-21 Thread David MENTRE
Hello Jon,

Thank you for the detailed reply. We have made significant progress
with your explanations.

Regards,
david -- for MapOSMatic team

___
dev mailing list
dev@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev


[OSM-dev] Questions on Nominatim and administrative boundaries + osm2pgsql

2009-12-20 Thread David MENTRE
Dear fellow OSM hackers,

We are working on improving MapOSMatic, especially for international support.

We are using http://nominatim.openstreetmap.org to query OSM in a
human-friendly way, which, indeed, is a wonderful tool!

Now we would like to use its results to query our own copy of the DB
(created with osm2pgsql). We found a way to do this, but we are not
quite sure it's the right way (tm) to do it...

For example, we query Nominatim for Paris. One of the results is an
administrative boundary limit (the one with osm_id 7444). For that
entry, we would like to query our OSM DB to determine its
administrative level.

If we do:
  select * from planet_osm_line where osm_id=7444;
then we don't get anything.

However, when we do:
  select * from planet_osm_line where osm_id=-7444;
then we get exactly what we need.

Is this the right way to do it? Can we assume that, when nominatim
returns an entry with class=boundary type=administrative and
osm_type=relation, then we can safely query the planet_osm_line
table with the _opposite_ of osm_id?

Now, we already know that it does not always work like this... For
example, if we try this with the entry for Paris, Kentucky, United
States of America (osm_id 130722), then it simply does not work at
all. In fact, it doesn't seem to work at all with none of the other
administrative boundary query results that nominatim returns us for
Paris.

Should we instead query the planet_osm_rels table? Can we assume this
table is always present in the database? If yes, how do we parse its
fields to get the IDs to the other tables?

Are there any documentation on the DB tables produced by osm2pgsql?

Thanks a lot in advance!
Regards,

david -- for MapOSMatic dev team

___
dev mailing list
dev@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev


Re: [OSM-dev] Questions on Nominatim and administrative boundaries + osm2pgsql

2009-12-20 Thread John Smith
2009/12/20 David MENTRE dmen...@linux-france.org:
 If we do:
  select * from planet_osm_line where osm_id=7444;
 then we don't get anything.

 However, when we do:
  select * from planet_osm_line where osm_id=-7444;
 then we get exactly what we need.

I think ways are positive and relations are negative, that's just what
I've observed but I could be wrong.

___
dev mailing list
dev@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev


Re: [OSM-dev] Questions on Nominatim and administrative boundaries + osm2pgsql

2009-12-20 Thread Jon Burgess
On Sun, 2009-12-20 at 11:55 +0100, David MENTRE wrote:
 Dear fellow OSM hackers,
 
 We are working on improving MapOSMatic, especially for international support.
 
 We are using http://nominatim.openstreetmap.org to query OSM in a
 human-friendly way, which, indeed, is a wonderful tool!
 
 Now we would like to use its results to query our own copy of the DB
 (created with osm2pgsql). We found a way to do this, but we are not
 quite sure it's the right way (tm) to do it...
 
 For example, we query Nominatim for Paris. One of the results is an
 administrative boundary limit (the one with osm_id 7444). For that
 entry, we would like to query our OSM DB to determine its
 administrative level.
 
 If we do:
   select * from planet_osm_line where osm_id=7444;
 then we don't get anything.
 
 However, when we do:
   select * from planet_osm_line where osm_id=-7444;
 then we get exactly what we need.
 
 Is this the right way to do it? Can we assume that, when nominatim
 returns an entry with class=boundary type=administrative and
 osm_type=relation, then we can safely query the planet_osm_line
 table with the _opposite_ of osm_id?

This is correct. When osm2pgsql creates entries from relations in the
line (or roads) table then it uses the negative of the relation ID in
the osm_id column.

 Now, we already know that it does not always work like this... For
 example, if we try this with the entry for Paris, Kentucky, United
 States of America (osm_id 130722), then it simply does not work at
 all. In fact, it doesn't seem to work at all with none of the other
 administrative boundary query results that nominatim returns us for
 Paris.

The boundary 130722 must be a complete closed ring, this means it ends
up in the polygon table instead. Again it has a negative ID because it
was generated from a relation:

gis= select osm_id,name,boundary,admin_level from planet_osm_polygon
where osm_id in (130722,-130722);
 osm_id  | name  |boundary| admin_level
-+---++-
 -130722 | Paris | administrative | 8

I did consider putting a copy of these polygons into the line (or roads)
tables but in the end I decided against it. 

The ways which make up the 7444 relation must have an error in them
somewhere which prevents osm2pgsql from forming a polygon.

 Should we instead query the planet_osm_rels table? Can we assume this
 table is always present in the database? If yes, how do we parse its
 fields to get the IDs to the other tables?

The _rels table is present if you use the --slim mode. The fields are a
little trickier to parse, you may get some inspiration from the queries
used by osm2pgsql otherwise you'll need to read up on how the postgresql
intarray feature works.

 Are there any documentation on the DB tables produced by osm2pgsql?

Not that I am aware of.

One thing that you might like to know is that the backend database for
nominatim is also generated using osm2pgsql, using the gazetteer mode.
http://wiki.openstreetmap.org/wiki/Nominatim
http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/gazetteer/README.txt


 Thanks a lot in advance!
 Regards,
 
 david -- for MapOSMatic dev team
 
 ___
 dev mailing list
 dev@openstreetmap.org
 http://lists.openstreetmap.org/listinfo/dev



___
dev mailing list
dev@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev


Re: [OSM-dev] Questions on Nominatim and administrative boundaries + osm2pgsql

2009-12-20 Thread Jon Burgess
On Sun, 2009-12-20 at 11:27 +, Jon Burgess wrote:
 On Sun, 2009-12-20 at 11:55 +0100, David MENTRE wrote:
  Dear fellow OSM hackers,
  
  We are working on improving MapOSMatic, especially for international 
  support.
  
  We are using http://nominatim.openstreetmap.org to query OSM in a
  human-friendly way, which, indeed, is a wonderful tool!
  
  Now we would like to use its results to query our own copy of the DB
  (created with osm2pgsql). We found a way to do this, but we are not
  quite sure it's the right way (tm) to do it...
  
  For example, we query Nominatim for Paris. One of the results is an
  administrative boundary limit (the one with osm_id 7444). For that
  entry, we would like to query our OSM DB to determine its
  administrative level.
  
  If we do:
select * from planet_osm_line where osm_id=7444;
  then we don't get anything.
  
  However, when we do:
select * from planet_osm_line where osm_id=-7444;
  then we get exactly what we need.
  
  Is this the right way to do it? Can we assume that, when nominatim
  returns an entry with class=boundary type=administrative and
  osm_type=relation, then we can safely query the planet_osm_line
  table with the _opposite_ of osm_id?

...

 The ways which make up the 7444 relation must have an error in them
 somewhere which prevents osm2pgsql from forming a polygon.

On closer inspection, the Paris boundary does form a complete closed
polygon and is stored in the _polygon table as well:

gis= select osm_id,name,boundary,admin_level from planet_osm_polygon
where osm_id in (7444,-7444);
 osm_id | name  |boundary| admin_level
+---++-
  -7444 | Paris | administrative | 8

All boundaries which form a closed ring should have entries in the
polygon table.

Jon



___
dev mailing list
dev@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev