summaryrefslogtreecommitdiff
path: root/navit
diff options
context:
space:
mode:
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-07-05 13:20:53 +0000
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-07-05 13:20:53 +0000
commit133d637c6b6a5d7ca384be83a26459540aa5ba35 (patch)
tree34385d94de5f609a09d7903a3d8574737fc21a56 /navit
parentb878774ac09ce4a6addb3adf4e687bc1e9c42a99 (diff)
downloadnavit-133d637c6b6a5d7ca384be83a26459540aa5ba35.tar.gz
Add:maptool:Add POIs for OSM way objects if appropriate|Thanks tryagain
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@4582 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit')
-rw-r--r--navit/maptool/geom.c83
-rw-r--r--navit/maptool/maptool.c55
-rw-r--r--navit/maptool/maptool.h14
-rw-r--r--navit/maptool/osm.c375
-rw-r--r--navit/maptool/osm_o5m.c4
-rw-r--r--navit/maptool/osm_protobuf.c12
-rw-r--r--navit/maptool/osm_psql.c4
-rw-r--r--navit/maptool/osm_xml.c4
8 files changed, 362 insertions, 189 deletions
diff --git a/navit/maptool/geom.c b/navit/maptool/geom.c
index 70df51a90..88f0c177e 100644
--- a/navit/maptool/geom.c
+++ b/navit/maptool/geom.c
@@ -60,7 +60,7 @@ geom_poly_area(struct coord *c, int count)
#if 0
fprintf(stderr,"(%d+%d)*(%d-%d)=%d*%d="LONGLONG_FMT"\n",c[i].x,c[j].x,c[i].y,c[j].y,c[i].x+c[j].x,c[i].y-c[j].y,(long long)(c[i].x+c[j].x)*(c[i].y-c[j].y));
#endif
- area+=(long long)(c[i].x+c[j].x)*(c[i].y-c[j].y);
+ area+=(long long)(c[i].x+c[j].x)*(c[i].y-c[j].y);
#if 0
fprintf(stderr,"area="LONGLONG_FMT"\n",area);
#endif
@@ -68,6 +68,87 @@ geom_poly_area(struct coord *c, int count)
return area/2;
}
+/**
+ * Get poly centroid coordinates.
+ * @param in *p array of poly vertex coordinates
+ * @param in count count of poly vertexes
+ * @param out *c coordinates of poly centroid
+ * @returns 1 on success, 0 if poly area is 0
+ */
+int
+geom_poly_centroid(struct coord *p, int count, struct coord *c)
+{
+ long long area=0/*geom_poly_area(p, count)*/;
+ long long sx=0,sy=0,tmp;
+ int i,j;
+ long long x0=p[0].x, y0=p[0].y, xi, yi, xj, yj;
+
+ /*fprintf(stderr,"area="LONGLONG_FMT"\n", area );*/
+ for (i=0,j=0; i<count; i++) {
+ if (++j == count)
+ j=0;
+ xi=p[i].x-x0;
+ yi=p[i].y-y0;
+ xj=p[j].x-x0;
+ yj=p[j].y-y0;
+ tmp=(xi*yj-xj*yi);
+ sx+=(xi+xj)*tmp;
+ sy+=(yi+yj)*tmp;
+ area+=xi*yj-xj*yi;
+ }
+ if(area!=0) {
+ c->x=x0+sx/3/area;
+ c->y=y0+sy/3/area;
+ return 1;
+ }
+ return 0;
+}
+
+/**
+ * Get coordinates of polyline point c most close to given point p.
+ * @param in *pl array of polyline vertex coordinates
+ * @param in count count of polyline vertexes
+ * @param in *p point coordinates
+ * @param out *c coordinates of polyline point most close to given point.
+ * @returns first vertex number of polyline segment to which c belongs
+ */
+int
+geom_poly_closest_point(struct coord *pl, int count, struct coord *p, struct coord *c)
+{
+ int i,vertex=0;
+ long long x, y, xi, xj, yi, yj, u, d, dmin=0;
+ if(count<2) {
+ c->x=pl->x;
+ c->y=pl->y;
+ return 0;
+ }
+ for(i=0;i<count-1;i++) {
+ xi=pl[i].x;
+ yi=pl[i].y;
+ xj=pl[i+1].x;
+ yj=pl[i+1].y;
+ u=(xj-xi)*(xj-xi)+(yj-yi)*(yj-yi);
+ if(u!=0) {
+ u=((p->x-xi)*(xj-xi)+(p->y-yi)*(yj-yi))*1000/u;
+ }
+ if(u<0)
+ u=0;
+ else if (u>1000)
+ u=1000;
+ x=xi+u*(xj-xi)/1000;
+ y=yi+u*(yj-yi)/1000;
+ d=(p->x-x)*(p->x-x)+(p->y-y)*(p->y-y);
+ if(i==0 || d<dmin) {
+ dmin=d;
+ c->x=x;
+ c->y=y;
+ vertex=i;
+ }
+ }
+ return vertex;
+}
+
+
GList *
geom_poly_segments_insert(GList *list, struct geom_poly_segment *first, struct geom_poly_segment *second, struct geom_poly_segment *third)
{
diff --git a/navit/maptool/maptool.c b/navit/maptool/maptool.c
index 0f5ba00e1..ce68092a4 100644
--- a/navit/maptool/maptool.c
+++ b/navit/maptool/maptool.c
@@ -112,6 +112,7 @@ usage(FILE *f)
fprintf(f,"bzcat planet.osm.bz2 | maptool mymap.bin\n");
fprintf(f,"Available switches:\n");
fprintf(f,"-h (--help) : this screen\n");
+ fprintf(f,"-2 (--doway2poi) : convert ways and polygons to POIs when applicable\n");
fprintf(f,"-5 (--md5) : set file where to write md5 sum\n");
fprintf(f,"-6 (--64bit) : set zip 64 bit compression\n");
fprintf(f,"-a (--attr-debug-level) : control which data is included in the debug attribute\n");
@@ -122,7 +123,7 @@ usage(FILE *f)
fprintf(f,"-e (--end) : end at specified phase\n");
fprintf(f,"-i (--input-file) : specify the input file name (OSM), overrules default stdin\n");
fprintf(f,"-k (--keep-tmpfiles) : do not delete tmp files after processing. useful to reuse them\n\n");
- fprintf(f,"-M (--o5m) : input file os o5m\n");
+ fprintf(f,"-M (--o5m) : input file os o5m\n");
fprintf(f,"-N (--nodes-only) : process only nodes\n");
fprintf(f,"-o (--coverage) : map every street to item coverage\n");
fprintf(f,"-P (--protobuf) : input file is protobuf\n");
@@ -139,7 +140,7 @@ usage(FILE *f)
int main(int argc, char **argv)
{
- FILE *ways=NULL,*ways_split=NULL,*ways_split_index=NULL,*nodes=NULL,*turn_restrictions=NULL,*graph=NULL,*coastline=NULL,*tilesdir,*coords,*relations=NULL,*boundaries=NULL;
+ FILE *ways=NULL, *way2poi=NULL, *ways_split=NULL,*ways_split_index=NULL,*nodes=NULL,*turn_restrictions=NULL,*graph=NULL,*coastline=NULL,*tilesdir,*coords,*relations=NULL,*boundaries=NULL;
FILE *files[10];
FILE *references[10];
@@ -159,6 +160,7 @@ int main(int argc, char **argv)
int input=0;
int protobuf=0;
int o5m=0;
+ int doway2poi=0;
int f,pos;
char *result,*optarg_cp,*attr_name,*attr_value;
char *protobufdb=NULL,*protobufdb_operation=NULL,*md5file=NULL;
@@ -199,6 +201,7 @@ int main(int argc, char **argv)
#endif
int option_index = 0;
static struct option long_options[] = {
+ {"doway2poi", 0, 0, '2'},
{"md5", 1, 0, '5'},
{"64bit", 0, 0, '6'},
{"attr-debug-level", 1, 0, 'a'},
@@ -228,7 +231,7 @@ int main(int argc, char **argv)
{"unknown-country", 0, 0, 'U'},
{0, 0, 0, 0}
};
- c = getopt_long (argc, argv, "5:6B:DMNO:PWS:a:bc"
+ c = getopt_long (argc, argv, "25:6B:DMNO:PWS:a:bc"
#ifdef HAVE_POSTGRESQL
"d:"
#endif
@@ -236,6 +239,9 @@ int main(int argc, char **argv)
if (c == -1)
break;
switch (c) {
+ case '2':
+ doway2poi=1;
+ break;
case '5':
md5file=optarg;
break;
@@ -386,15 +392,18 @@ int main(int argc, char **argv)
ways=tempfile(suffix,"ways",1);
if (process_nodes)
nodes=tempfile(suffix,"nodes",1);
- if (process_ways && process_nodes)
+ if (process_ways && process_nodes) {
turn_restrictions=tempfile(suffix,"turn_restrictions",1);
+ if(doway2poi)
+ way2poi=tempfile(suffix,"way2poi",1);
+ }
if (process_relations)
boundaries=tempfile(suffix,"boundaries",1);
phase=1;
fprintf(stderr,"PROGRESS: Phase 1: collecting data\n");
#ifdef HAVE_POSTGRESQL
if (dbstr)
- map_collect_data_osm_db(dbstr,ways,nodes,turn_restrictions,boundaries);
+ map_collect_data_osm_db(dbstr,ways,way2poi,nodes,turn_restrictions,boundaries);
else
#endif
if (map_handles) {
@@ -407,24 +416,47 @@ int main(int argc, char **argv)
}
}
else if (protobuf)
- map_collect_data_osm_protobuf(input_file,ways,nodes,turn_restrictions,boundaries);
+ map_collect_data_osm_protobuf(input_file,ways,way2poi,nodes,turn_restrictions,boundaries);
else if (o5m)
- map_collect_data_osm_o5m(input_file,ways,nodes,turn_restrictions,boundaries);
+ map_collect_data_osm_o5m(input_file,ways,way2poi,nodes,turn_restrictions,boundaries);
else
- map_collect_data_osm(input_file,ways,nodes,turn_restrictions,boundaries);
+ map_collect_data_osm(input_file,ways,way2poi,nodes,turn_restrictions,boundaries);
if (slices) {
fprintf(stderr,"%d slices\n",slices);
flush_nodes(1);
for (i = slices-2 ; i>=0 ; i--) {
fprintf(stderr, "slice %d of %d\n",slices-i-1,slices-1);
load_buffer("coords.tmp",&node_buffer, i*slice_size, slice_size);
- resolve_ways(ways, NULL);
+ resolve_ways(ways, NULL, 1);
save_buffer("coords.tmp",&node_buffer, i*slice_size);
+ if(way2poi) {
+ FILE *way2poinew=tempfile(suffix,"way2poinew",1);
+ resolve_ways(way2poi, way2poinew, 0);
+ fclose(way2poi);
+ fclose(way2poinew);
+ tempfile_rename(suffix,"way2poinew","way2poi");
+ way2poi=tempfile(suffix,"way2poi",0);
+ }
}
- } else
+ } else {
save_buffer("coords.tmp",&node_buffer, 0);
+ if(way2poi) {
+ FILE *way2poinew=tempfile(suffix,"way2poinew",1);
+ resolve_ways(way2poi, way2poinew, 0);
+ fclose(way2poi);
+ fclose(way2poinew);
+ tempfile_rename(suffix,"way2poinew","way2poi");
+ way2poi=tempfile(suffix,"way2poi",0);
+ }
+ }
if (ways)
fclose(ways);
+ if (way2poi) {
+ fclose(way2poi);
+ way2poi=tempfile(suffix,"way2poi",0);
+ process_binfile(way2poi, nodes);
+ fclose(way2poi);
+ }
if (nodes)
fclose(nodes);
if (turn_restrictions)
@@ -578,6 +610,7 @@ int main(int argc, char **argv)
files[1]=tempfile(suffix,"ways_split",0);
if (process_nodes)
files[2]=tempfile(suffix,"nodes",0);
+
phase4(files,3,0,suffix,tilesdir,zip_info);
for (f = 0 ; f < 3 ; f++) {
if (files[f])
@@ -628,6 +661,7 @@ int main(int argc, char **argv)
}
if (process_nodes)
files[2]=tempfile(suffix,"nodes",0);
+
fprintf(stderr,"Slice %d\n",i);
phase5(files,references,3,0,suffix,zip_info);
@@ -642,6 +676,7 @@ int main(int argc, char **argv)
tempfile_unlink(suffix,"relations");
tempfile_unlink(suffix,"nodes");
tempfile_unlink(suffix,"ways_split");
+ tempfile_unlink(suffix,"way2poi");
tempfile_unlink(suffix,"ways_split_ref");
tempfile_unlink(suffix,"coastline");
tempfile_unlink(suffix,"turn_restrictions");
diff --git a/navit/maptool/maptool.h b/navit/maptool/maptool.h
index d5b3c0d53..88873b566 100644
--- a/navit/maptool/maptool.h
+++ b/navit/maptool/maptool.h
@@ -144,6 +144,8 @@ struct geom_poly_segment {
void geom_coord_copy(struct coord *from, struct coord *to, int count, int reverse);
void geom_coord_revert(struct coord *c, int count);
long long geom_poly_area(struct coord *c, int count);
+int geom_poly_centroid(struct coord *c, int count, struct coord *r);
+int geom_poly_closest_point(struct coord *pl, int count, struct coord *p, struct coord *c);
GList *geom_poly_segments_insert(GList *list, struct geom_poly_segment *first, struct geom_poly_segment *second, struct geom_poly_segment *third);
void geom_poly_segment_destroy(struct geom_poly_segment *seg);
GList *geom_poly_segments_remove(GList *list, struct geom_poly_segment *seg);
@@ -235,33 +237,33 @@ void osm_add_way(osmid id);
void osm_add_relation(osmid id);
void osm_end_relation(FILE *turn_restrictions, FILE *boundaries);
void osm_add_member(int type, osmid ref, char *role);
-void osm_end_way(FILE *out);
+void osm_end_way(FILE *out, FILE *outwaypoi);
void osm_end_node(FILE *out);
void osm_add_nd(osmid ref);
long long item_bin_get_id(struct item_bin *ib);
void flush_nodes(int final);
void sort_countries(int keep_tmpfiles);
void process_turn_restrictions(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out);
-int resolve_ways(FILE *in, FILE *out);
+int resolve_ways(FILE *in, FILE *out, int countreferences);
int map_find_intersections(FILE *in, FILE *out, FILE *out_index, FILE *out_graph, FILE *out_coastline, int final);
void write_countrydir(struct zip_info *zip_info);
void remove_countryfiles(void);
void osm_init(FILE*);
/* osm_o5m.c */
-int map_collect_data_osm_o5m(FILE *in, FILE *out_ways, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries);
+int map_collect_data_osm_o5m(FILE *in, FILE *out_ways, FILE *out_way2poi, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries);
/* osm_psql.c */
-int map_collect_data_osm_db(char *dbstr, FILE *out_ways, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries);
+int map_collect_data_osm_db(char *dbstr, FILE *out_ways, FILE *out_way2poi, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries);
/* osm_protobuf.c */
-int map_collect_data_osm_protobuf(FILE *in, FILE *out_ways, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries);
+int map_collect_data_osm_protobuf(FILE *in, FILE *out_ways, FILE *out_way2poi, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries);
int osm_protobufdb_load(FILE *in, char *dir);
/* osm_xml.c */
int osm_xml_get_attribute(char *xml, char *attribute, char *buffer, int buffer_size);
void osm_xml_decode_entities(char *buffer);
-int map_collect_data_osm(FILE *in, FILE *out_ways, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries);
+int map_collect_data_osm(FILE *in, FILE *out_ways, FILE *out_way2poi, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries);
/* sourcesink.c */
diff --git a/navit/maptool/osm.c b/navit/maptool/osm.c
index fb8a4f23e..f85ac7838 100644
--- a/navit/maptool/osm.c
+++ b/navit/maptool/osm.c
@@ -351,96 +351,100 @@ struct country_table {
{ 999,"Unknown"},
};
+// first char - item type
+// =w - ways
+// =? - used both for nodes and ways
+// otherwise - nodes
static char *attrmap={
"n *=* point_unkn\n"
// "n Annehmlichkeit=Hochsitz poi_hunting_stand\n"
- "n addr:housenumber=* house_number\n"
- "n aeroway=aerodrome poi_airport\n"
- "n aeroway=airport poi_airport\n"
- "n aeroway=helipad poi_heliport\n"
- "n aeroway=terminal poi_airport\n"
- "n amenity=atm poi_bank\n"
- "n amenity=bank poi_bank\n"
- "n amenity=bar poi_bar\n"
+ "? addr:housenumber=* house_number\n"
+ "? aeroway=aerodrome poi_airport\n"
+ "? aeroway=airport poi_airport\n"
+ "? aeroway=helipad poi_heliport\n"
+ "? aeroway=terminal poi_airport\n"
+ "? amenity=atm poi_bank\n"
+ "? amenity=bank poi_bank\n"
+ "? amenity=bar poi_bar\n"
"n amenity=bench poi_bench\n"
- "n amenity=biergarten poi_biergarten\n"
- "n amenity=bus_station poi_bus_station\n"
- "n amenity=cafe poi_cafe\n"
- "n amenity=car_wash poi_car_wash\n"
- "n amenity=cinema poi_cinema\n"
- "n amenity=college poi_school_college\n"
- "n amenity=courthouse poi_justice\n"
- "n amenity=drinking_water poi_potable_water\n"
- "n amenity=fast_food poi_fastfood\n"
- "n amenity=fire_station poi_firebrigade\n"
- "n amenity=fountain poi_fountain\n"
- "n amenity=fuel poi_fuel\n"
- "n amenity=grave_yard poi_cemetery\n"
- "n amenity=hospital poi_hospital\n"
- "n amenity=hunting_stand poi_hunting_stand\n"
- "n amenity=kindergarten poi_kindergarten\n"
- "n amenity=library poi_library\n"
- "n amenity=nightclub poi_nightclub\n"
- "n amenity=park_bench poi_bench\n"
- "n amenity=parking poi_car_parking\n"
- "n amenity=pharmacy poi_pharmacy\n"
- "n amenity=place_of_worship,religion=christian poi_church\n"
- "n amenity=place_of_worship poi_worship\n"
- "n amenity=police poi_police\n"
- "n amenity=post_box poi_post_box\n"
- "n amenity=post_office poi_post_office\n"
- "n amenity=prison poi_prison\n"
- "n amenity=pub poi_pub\n"
- "n amenity=public_building poi_public_office\n"
- "n amenity=recycling poi_recycling\n"
- "n amenity=restaurant,cuisine=fine_dining poi_dining\n"
- "n amenity=restaurant poi_restaurant\n"
- "n amenity=school poi_school\n"
- "n amenity=shelter poi_shelter\n"
- "n amenity=taxi poi_taxi\n"
- "n amenity=tec_common tec_common\n"
- "n amenity=telephone poi_telephone\n"
- "n amenity=theatre poi_theater\n"
- "n amenity=toilets poi_restroom\n"
- "n amenity=townhall poi_townhall\n"
- "n amenity=university poi_school_university\n"
- "n amenity=vending_machine poi_vending_machine\n"
+ "? amenity=biergarten poi_biergarten\n"
+ "? amenity=bus_station poi_bus_station\n"
+ "? amenity=cafe poi_cafe\n"
+ "? amenity=car_wash poi_car_wash\n"
+ "? amenity=cinema poi_cinema\n"
+ "? amenity=college poi_school_college\n"
+ "? amenity=courthouse poi_justice\n"
+ "? amenity=drinking_water poi_potable_water\n"
+ "? amenity=fast_food poi_fastfood\n"
+ "? amenity=fire_station poi_firebrigade\n"
+ "? amenity=fountain poi_fountain\n"
+ "? amenity=fuel poi_fuel\n"
+ "? amenity=grave_yard poi_cemetery\n"
+ "? amenity=hospital poi_hospital\n"
+ "? amenity=hunting_stand poi_hunting_stand\n"
+ "? amenity=kindergarten poi_kindergarten\n"
+ "? amenity=library poi_library\n"
+ "? amenity=nightclub poi_nightclub\n"
+ "? amenity=park_bench poi_bench\n"
+ "? amenity=parking poi_car_parking\n"
+ "? amenity=pharmacy poi_pharmacy\n"
+ "? amenity=place_of_worship,religion=christian poi_church\n"
+ "? amenity=place_of_worship poi_worship\n"
+ "? amenity=police poi_police\n"
+ "? amenity=post_box poi_post_box\n"
+ "? amenity=post_office poi_post_office\n"
+ "? amenity=prison poi_prison\n"
+ "? amenity=pub poi_pub\n"
+ "? amenity=public_building poi_public_office\n"
+ "? amenity=recycling poi_recycling\n"
+ "? amenity=restaurant,cuisine=fine_dining poi_dining\n"
+ "? amenity=restaurant poi_restaurant\n"
+ "? amenity=school poi_school\n"
+ "? amenity=shelter poi_shelter\n"
+ "? amenity=taxi poi_taxi\n"
+ "? amenity=tec_common tec_common\n"
+ "? amenity=telephone poi_telephone\n"
+ "? amenity=theatre poi_theater\n"
+ "? amenity=toilets poi_restroom\n"
+ "? amenity=townhall poi_townhall\n"
+ "? amenity=university poi_school_university\n"
+ "? amenity=vending_machine poi_vending_machine\n"
"n barrier=bollard barrier_bollard\n"
"n barrier=cycle_barrier barrier_cycle\n"
"n barrier=lift_gate barrier_lift_gate\n"
- "n car=car_rental poi_car_rent\n"
- "n highway=bus_station poi_bus_station\n"
- "n highway=bus_stop poi_bus_stop\n"
+ "? car=car_rental poi_car_rent\n"
+ "? highway=bus_station poi_bus_station\n"
+ "? highway=bus_stop poi_bus_stop\n"
"n highway=mini_roundabout mini_roundabout\n"
"n highway=motorway_junction highway_exit\n"
"n highway=stop traffic_sign_stop\n"
"n highway=toll_booth poi_toll_booth\n"
"n highway=traffic_signals traffic_signals\n"
"n highway=turning_circle turning_circle\n"
- "n historic=boundary_stone poi_boundary_stone\n"
- "n historic=castle poi_castle\n"
- "n historic=memorial poi_memorial\n"
- "n historic=monument poi_monument\n"
- "n historic=ruins poi_ruins\n"
-// "n historic=* poi_ruins\n"
- "n landuse=cemetery poi_cemetery\n"
- "n leisure=fishing poi_fish\n"
- "n leisure=golf_course poi_golf\n"
- "n leisure=marina poi_marine\n"
- "n leisure=playground poi_playground\n"
- "n leisure=slipway poi_boat_ramp\n"
- "n leisure=sports_centre poi_sport\n"
- "n leisure=stadium poi_stadium\n"
- "n man_made=tower poi_tower\n"
- "n military=airfield poi_military\n"
- "n military=barracks poi_military\n"
- "n military=bunker poi_military\n"
- "n military=danger_area poi_danger_area\n"
- "n military=range poi_military\n"
- "n natural=bay poi_bay\n"
- "n natural=peak,ele=* poi_peak\n" // show only major peaks with elevation
- "n natural=tree poi_tree\n"
+ "? historic=boundary_stone poi_boundary_stone\n"
+ "? historic=castle poi_castle\n"
+ "? historic=memorial poi_memorial\n"
+ "? historic=monument poi_monument\n"
+ "? historic=ruins poi_ruins\n"
+// "? historic=* poi_ruins\n"
+ "? landuse=cemetery poi_cemetery\n"
+ "? leisure=fishing poi_fish\n"
+ "? leisure=golf_course poi_golf\n"
+ "? leisure=marina poi_marine\n"
+ "? leisure=playground poi_playground\n"
+ "? leisure=slipway poi_boat_ramp\n"
+ "? leisure=sports_centre poi_sport\n"
+ "? leisure=stadium poi_stadium\n"
+ "? man_made=tower poi_tower\n"
+ "? military=airfield poi_military\n"
+ "? military=barracks poi_military\n"
+ "? military=bunker poi_military\n"
+ "? military=danger_area poi_danger_area\n"
+ "? military=range poi_military\n"
+ "? natural=bay poi_bay\n"
+ "? natural=peak,ele=* poi_peak\n" // show only major peaks with elevation
+ "? natural=tree poi_tree\n"
"n place=city town_label_2e5\n"
"n place=hamlet town_label_2e2\n"
"n place=locality town_label_2e0\n"
@@ -451,54 +455,54 @@ static char *attrmap={
"n power=sub_station power_substation\n"
"n railway=halt poi_rail_halt\n"
"n railway=level_crossing poi_level_crossing\n"
- "n railway=station poi_rail_station\n"
- "n railway=tram_stop poi_rail_tram_stop\n"
- "n shop=baker poi_shop_baker\n"
- "n shop=bakery poi_shop_baker\n"
- "n shop=beverages poi_shop_beverages\n"
- "n shop=bicycle poi_shop_bicycle\n"
- "n shop=butcher poi_shop_butcher\n"
- "n shop=car poi_car_dealer_parts\n"
- "n shop=car_repair poi_repair_service\n"
- "n shop=clothes poi_shop_apparel\n"
- "n shop=convenience poi_shop_grocery\n"
- "n shop=drogist poi_shop_drugstore\n"
- "n shop=florist poi_shop_florist\n"
- "n shop=fruit poi_shop_fruit\n"
- "n shop=furniture poi_shop_furniture\n"
- "n shop=garden_centre poi_shop_handg\n"
- "n shop=hardware poi_shop_handg\n"
- "n shop=hairdresser poi_hairdresser\n"
- "n shop=kiosk poi_shop_kiosk\n"
- "n shop=optician poi_shop_optician\n"
- "n shop=parfum poi_shop_parfum\n"
- "n shop=photo poi_shop_photo\n"
- "n shop=shoes poi_shop_shoes\n"
- "n shop=supermarket poi_shopping\n"
- "n sport=10pin poi_bowling\n"
- "n sport=baseball poi_baseball\n"
- "n sport=basketball poi_basketball\n"
- "n sport=climbing poi_climbing\n"
- "n sport=golf poi_golf\n"
- "n sport=motor_sports poi_motor_sport\n"
- "n sport=skiing poi_skiing\n"
- "n sport=soccer poi_soccer\n"
- "n sport=stadium poi_stadium\n"
- "n sport=swimming poi_swimming\n"
- "n sport=tennis poi_tennis\n"
- "n tourism=attraction poi_attraction\n"
- "n tourism=camp_site poi_camp_rv\n"
- "n tourism=caravan_site poi_camp_rv\n"
- "n tourism=guest_house poi_guesthouse\n"
- "n tourism=hostel poi_hostel\n"
- "n tourism=hotel poi_hotel\n"
- "n tourism=information poi_information\n"
- "n tourism=motel poi_motel\n"
- "n tourism=museum poi_museum_history\n"
- "n tourism=picnic_site poi_picnic\n"
- "n tourism=theme_park poi_resort\n"
- "n tourism=viewpoint poi_viewpoint\n"
- "n tourism=zoo poi_zoo\n"
+ "? railway=station poi_rail_station\n"
+ "? railway=tram_stop poi_rail_tram_stop\n"
+ "? shop=baker poi_shop_baker\n"
+ "? shop=bakery poi_shop_baker\n"
+ "? shop=beverages poi_shop_beverages\n"
+ "? shop=bicycle poi_shop_bicycle\n"
+ "? shop=butcher poi_shop_butcher\n"
+ "? shop=car poi_car_dealer_parts\n"
+ "? shop=car_repair poi_repair_service\n"
+ "? shop=clothes poi_shop_apparel\n"
+ "? shop=convenience poi_shop_grocery\n"
+ "? shop=drogist poi_shop_drugstore\n"
+ "? shop=florist poi_shop_florist\n"
+ "? shop=fruit poi_shop_fruit\n"
+ "? shop=furniture poi_shop_furniture\n"
+ "? shop=garden_centre poi_shop_handg\n"
+ "? shop=hardware poi_shop_handg\n"
+ "? shop=hairdresser poi_hairdresser\n"
+ "? shop=kiosk poi_shop_kiosk\n"
+ "? shop=optician poi_shop_optician\n"
+ "? shop=parfum poi_shop_parfum\n"
+ "? shop=photo poi_shop_photo\n"
+ "? shop=shoes poi_shop_shoes\n"
+ "? shop=supermarket poi_shopping\n"
+ "? sport=10pin poi_bowling\n"
+ "? sport=baseball poi_baseball\n"
+ "? sport=basketball poi_basketball\n"
+ "? sport=climbing poi_climbing\n"
+ "? sport=golf poi_golf\n"
+ "? sport=motor_sports poi_motor_sport\n"
+ "? sport=skiing poi_skiing\n"
+ "? sport=soccer poi_soccer\n"
+ "? sport=stadium poi_stadium\n"
+ "? sport=swimming poi_swimming\n"
+ "? sport=tennis poi_tennis\n"
+ "? tourism=attraction poi_attraction\n"
+ "? tourism=camp_site poi_camp_rv\n"
+ "? tourism=caravan_site poi_camp_rv\n"
+ "? tourism=guest_house poi_guesthouse\n"
+ "? tourism=hostel poi_hostel\n"
+ "? tourism=hotel poi_hotel\n"
+ "? tourism=information poi_information\n"
+ "? tourism=motel poi_motel\n"
+ "? tourism=museum poi_museum_history\n"
+ "? tourism=picnic_site poi_picnic\n"
+ "? tourism=theme_park poi_resort\n"
+ "? tourism=viewpoint poi_viewpoint\n"
+ "? tourism=zoo poi_zoo\n"
"n traffic_sign=city_limit traffic_sign_city_limit\n"
"n highway=speed_camera tec_common\n"
"w *=* street_unkn\n"
@@ -710,8 +714,8 @@ static void
build_attrmap_line(char *line)
{
char *t=NULL,*kvl=NULL,*i=NULL,*p,*kv;
- struct attr_mapping ***attr_mapping_curr,*attr_mapping=g_malloc0(sizeof(struct attr_mapping));
- int idx,attr_mapping_count=0,*attr_mapping_curr_count;
+ struct attr_mapping *attr_mapping=g_malloc0(sizeof(struct attr_mapping));
+ int idx,attr_mapping_count=0;
t=line;
p=strchr(t,'\t');
if (p) {
@@ -728,13 +732,9 @@ build_attrmap_line(char *line)
if (t[0] == 'w') {
if (! i)
i="street_unkn";
- attr_mapping_curr=&attr_mapping_way;
- attr_mapping_curr_count=&attr_mapping_way_count;
} else {
if (! i)
i="point_unkn";
- attr_mapping_curr=&attr_mapping_node;
- attr_mapping_curr_count=&attr_mapping_node_count;
}
attr_mapping->type=item_from_name(i);
while ((kv=strtok(kvl, ","))) {
@@ -747,8 +747,15 @@ build_attrmap_line(char *line)
attr_mapping->attr_present_idx[attr_mapping_count++]=idx;
attr_mapping->attr_present_idx_count=attr_mapping_count;
}
- *attr_mapping_curr=g_realloc(*attr_mapping_curr, sizeof(**attr_mapping_curr)*(*attr_mapping_curr_count+1));
- (*attr_mapping_curr)[(*attr_mapping_curr_count)++]=attr_mapping;
+ if (t[0]== 'w' || t[0]== '?') {
+ attr_mapping_way=g_realloc(attr_mapping_way, sizeof(*attr_mapping_way)*(attr_mapping_way_count+1));
+ attr_mapping_way[attr_mapping_way_count++]=attr_mapping;
+ }
+ if (t[0]!= 'w') {
+ attr_mapping_node=g_realloc(attr_mapping_node, sizeof(*attr_mapping_node)*(attr_mapping_node_count+1));
+ attr_mapping_node[attr_mapping_node_count++]=attr_mapping;
+ }
+
}
static void
@@ -1283,7 +1290,6 @@ node_item_get(int id)
if (interval > 1)
interval/=2;
}
-
return &ni[p];
}
@@ -1509,7 +1515,7 @@ attr_longest_match(struct attr_mapping **mapping, int mapping_count, enum item_t
}
void
-osm_end_way(FILE *out)
+osm_end_way(FILE *out, FILE *outwaypoi)
{
int i,count;
int *def_flags,add_flags;
@@ -1542,6 +1548,8 @@ osm_end_way(FILE *out)
continue;
if (ignore_unkown && (types[i] == type_street_unkn || types[i] == type_point_unkn))
continue;
+ if(!outwaypoi && types[i]<type_line)
+ continue;
item_bin=init_item(types[i]);
item_bin_add_coord(item_bin, coord_buffer, coord_count);
def_flags=item_get_default_flags(types[i]);
@@ -1551,15 +1559,31 @@ osm_end_way(FILE *out)
add_flags=1;
}
item_bin_add_attr_string(item_bin, def_flags ? attr_street_name : attr_label, attr_strings[attr_string_label]);
- item_bin_add_attr_string(item_bin, attr_street_name_systematic, attr_strings[attr_string_street_name_systematic]);
+ if(item_bin->type>type_line) {
+ item_bin_add_attr_string(item_bin, attr_street_name_systematic, attr_strings[attr_string_street_name_systematic]);
+ }
item_bin_add_attr_longlong(item_bin, attr_osm_wayid, osmid_attr_value);
if (debug_attr_buffer[0])
item_bin_add_attr_string(item_bin, attr_debug, debug_attr_buffer);
- if (add_flags)
- item_bin_add_attr_int(item_bin, attr_flags, flags_attr_value);
- if (maxspeed_attr_value)
- item_bin_add_attr_int(item_bin, attr_maxspeed, maxspeed_attr_value);
- item_bin_write(item_bin,out);
+ if(types[i]>=type_line) {
+ if (add_flags)
+ item_bin_add_attr_int(item_bin, attr_flags, flags_attr_value);
+ if (maxspeed_attr_value)
+ item_bin_add_attr_int(item_bin, attr_maxspeed, maxspeed_attr_value);
+ item_bin_write(item_bin,out);
+ } else {
+ item_bin_add_attr_string(item_bin, attr_house_number, attr_strings[attr_string_house_number]);
+ item_bin_add_attr_string(item_bin, attr_street_name, attr_strings[attr_string_street_name]);
+ item_bin_add_attr_string(item_bin, attr_phone, attr_strings[attr_string_phone]);
+ item_bin_add_attr_string(item_bin, attr_fax, attr_strings[attr_string_fax]);
+ item_bin_add_attr_string(item_bin, attr_email, attr_strings[attr_string_email]);
+ item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]);
+ item_bin_add_attr_string(item_bin, attr_url, attr_strings[attr_string_url]);
+
+ if(outwaypoi) {
+ item_bin_write(item_bin,outwaypoi);
+ }
+ }
}
}
@@ -1979,37 +2003,22 @@ process_countries(FILE *way, FILE *ways_index)
fclose(in);
}
-static void
-node_ref_way(osmid node)
+struct node_item *
+node_ref_way(osmid node, int countreferences)
{
struct node_item *ni;
ni=node_item_get(node);
- if (ni)
+ if (ni && countreferences)
ni->ref_way++;
+ return ni;
}
-int
-resolve_ways(FILE *in, FILE *out)
-{
- struct item_bin *ib;
- struct coord *c;
- int i;
-
- fseek(in, 0, SEEK_SET);
- while ((ib=read_item(in))) {
- c=(struct coord *)(ib+1);
- for (i = 0 ; i < ib->clen/2 ; i++) {
- node_ref_way(REF(c[i]));
- }
- }
- return 0;
-}
void
osm_add_nd(osmid ref)
{
SET_REF(coord_buffer[coord_count], ref);
- node_ref_way(ref);
+ node_ref_way(ref,1);
coord_count++;
if (coord_count > 65536) {
fprintf(stderr,"ERROR: Overflow\n");
@@ -2057,6 +2066,52 @@ write_item_part(FILE *out, FILE *out_index, FILE *out_graph, struct item_bin *or
}
int
+resolve_ways(FILE *in, FILE *out, int countreferences)
+{
+ struct item_bin *ib;
+ struct coord *c;
+ int i;
+ struct node_item *ni;
+
+ fseek(in, 0, SEEK_SET);
+ while ((ib=read_item(in))) {
+ int unresolved=0;
+ c=(struct coord *)(ib+1);
+ for (i = 0 ; i < ib->clen/2 ; i++) {
+ if(!IS_REF(c[i]))
+ continue;
+ ni=node_ref_way(REF(c[i]), countreferences);
+ if(ni && out) {
+ c[i].x=ni->c.x;
+ c[i].y=ni->c.y;
+ }
+ else
+ unresolved++;
+ }
+ if(out) {
+ if(unresolved==0 && ib->clen>2 && ib->type<type_line) {
+ if(ib->clen/2>2) {
+ if(!geom_poly_centroid(c,ib->clen/2,c)) {
+ // we have poly with zero area
+ // Falling back to coordinates of its first vertex...
+ osm_warning("way",item_bin_get_wayid(ib),0,"Broken polygon, area is 0\n");
+ }
+ } else if (ib->clen/2==2) {
+ osm_warning("way",item_bin_get_wayid(ib),0, "Expected polygon, but only two points defined\n");
+ c[0].x=(c[0].x+c[1].x)/2;
+ c[0].y=(c[0].y+c[1].y)/2;
+ }
+ write_item_part(out, NULL, NULL, ib, 0, 0, NULL);
+ } else {
+ item_bin_write(ib,out);
+ }
+ }
+ }
+ return 0;
+}
+
+
+int
map_find_intersections(FILE *in, FILE *out, FILE *out_index, FILE *out_graph, FILE *out_coastline, int final)
{
struct coord *c;
diff --git a/navit/maptool/osm_o5m.c b/navit/maptool/osm_o5m.c
index c90f50974..cfce3d491 100644
--- a/navit/maptool/osm_o5m.c
+++ b/navit/maptool/osm_o5m.c
@@ -170,7 +170,7 @@ o5m_print_end(char c)
}
int
-map_collect_data_osm_o5m(FILE *in, FILE *out_ways, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries)
+map_collect_data_osm_o5m(FILE *in, FILE *out_ways, FILE *out_way2poi, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries)
{
struct o5m o;
unsigned char c, *end, *rend;
@@ -304,7 +304,7 @@ map_collect_data_osm_o5m(FILE *in, FILE *out_ways, FILE *out_nodes, FILE *out_tu
osm_end_node(out_nodes);
break;
case 0x11:
- osm_end_way(out_ways);
+ osm_end_way(out_ways, out_way2poi);
break;
case 0x12:
osm_end_relation(out_turn_restrictions, out_boundaries);
diff --git a/navit/maptool/osm_protobuf.c b/navit/maptool/osm_protobuf.c
index 0bcf75782..b8008e9d1 100644
--- a/navit/maptool/osm_protobuf.c
+++ b/navit/maptool/osm_protobuf.c
@@ -241,7 +241,7 @@ process_info(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Info *info)
#endif
static void
-process_way(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Way *way, FILE *out_ways)
+process_way(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Way *way, FILE *out_ways, FILE *out_way2poi)
{
int i;
long long ref=0;
@@ -266,7 +266,7 @@ process_way(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Way *way, FILE *out
#if 0
printf("\t</way>\n");
#endif
- osm_end_way(out_ways);
+ osm_end_way(out_ways, out_way2poi);
}
static void
@@ -318,7 +318,7 @@ process_relation(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Relation *rela
}
static void
-process_osmdata(OSMPBF__Blob *blob, unsigned char *data, FILE *out_nodes, FILE *out_ways, FILE *out_turn_restrictions, FILE *out_boundaries)
+process_osmdata(OSMPBF__Blob *blob, unsigned char *data, FILE *out_nodes, FILE *out_ways, FILE *out_way2poi, FILE *out_turn_restrictions, FILE *out_boundaries)
{
int i,j;
OSMPBF__PrimitiveBlock *primitive_block;
@@ -327,7 +327,7 @@ process_osmdata(OSMPBF__Blob *blob, unsigned char *data, FILE *out_nodes, FILE *
OSMPBF__PrimitiveGroup *primitive_group=primitive_block->primitivegroup[i];
process_dense(primitive_block, primitive_group->dense, out_nodes);
for (j = 0 ; j < primitive_group->n_ways ; j++)
- process_way(primitive_block, primitive_group->ways[j], out_ways);
+ process_way(primitive_block, primitive_group->ways[j], out_ways, out_way2poi);
for (j = 0 ; j < primitive_group->n_relations ; j++)
process_relation(primitive_block, primitive_group->relations[j], out_turn_restrictions, out_boundaries);
#if 0
@@ -339,7 +339,7 @@ process_osmdata(OSMPBF__Blob *blob, unsigned char *data, FILE *out_nodes, FILE *
int
-map_collect_data_osm_protobuf(FILE *in, FILE *out_ways, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries)
+map_collect_data_osm_protobuf(FILE *in, FILE *out_ways, FILE *out_way2poi, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries)
{
OSMPBF__BlobHeader *header;
OSMPBF__Blob *blob;
@@ -354,7 +354,7 @@ map_collect_data_osm_protobuf(FILE *in, FILE *out_ways, FILE *out_nodes, FILE *o
if (!strcmp(header->type,"OSMHeader")) {
process_osmheader(blob, data);
} else if (!strcmp(header->type,"OSMData")) {
- process_osmdata(blob, data, out_nodes, out_ways, out_turn_restrictions, out_boundaries);
+ process_osmdata(blob, data, out_nodes, out_ways, out_way2poi, out_turn_restrictions, out_boundaries);
} else {
printf("unknown\n");
return 0;
diff --git a/navit/maptool/osm_psql.c b/navit/maptool/osm_psql.c
index 2365e8460..f116b41c7 100644
--- a/navit/maptool/osm_psql.c
+++ b/navit/maptool/osm_psql.c
@@ -28,7 +28,7 @@
#include <libpq-fe.h>
int
-map_collect_data_osm_db(char *dbstr, FILE *out_ways, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries)
+map_collect_data_osm_db(char *dbstr, FILE *out_ways, FILE *out_way2poi, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries)
{
PGconn *conn;
PGresult *res,*node,*way,*tag;
@@ -169,7 +169,7 @@ map_collect_data_osm_db(char *dbstr, FILE *out_ways, FILE *out_nodes, FILE *out_
break;
}
if (tagged)
- osm_end_way(out_ways);
+ osm_end_way(out_ways, out_way2poi);
}
PQclear(tag);
PQclear(node);
diff --git a/navit/maptool/osm_xml.c b/navit/maptool/osm_xml.c
index 210632a67..164a18718 100644
--- a/navit/maptool/osm_xml.c
+++ b/navit/maptool/osm_xml.c
@@ -178,7 +178,7 @@ parse_nd(char *p)
}
int
-map_collect_data_osm(FILE *in, FILE *out_ways, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries)
+map_collect_data_osm(FILE *in, FILE *out_ways, FILE *out_way2poi, FILE *out_nodes, FILE *out_turn_restrictions, FILE *out_boundaries)
{
int size=BUFFER_SIZE;
char buffer[size];
@@ -217,7 +217,7 @@ map_collect_data_osm(FILE *in, FILE *out_ways, FILE *out_nodes, FILE *out_turn_r
} else if (!strncmp(p, "</node>",7)) {
osm_end_node(out_nodes);
} else if (!strncmp(p, "</way>",6)) {
- osm_end_way(out_ways);
+ osm_end_way(out_ways, out_way2poi);
} else if (!strncmp(p, "</relation>",11)) {
osm_end_relation(out_turn_restrictions, out_boundaries);
} else if (!strncmp(p, "</osm>",6)) {