From 42f0d0963145995581b30310c2fc9f77182f71ea Mon Sep 17 00:00:00 2001 From: martin-s Date: Tue, 5 Jul 2011 13:20:53 +0000 Subject: [PATCH] Add:maptool:Add POIs for OSM way objects if appropriate|Thanks tryagain git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4582 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/navit/maptool/geom.c | 83 +++++++- navit/navit/maptool/maptool.c | 55 +++++- navit/navit/maptool/maptool.h | 14 +- navit/navit/maptool/osm.c | 375 +++++++++++++++++++++---------------- navit/navit/maptool/osm_o5m.c | 4 +- navit/navit/maptool/osm_protobuf.c | 12 +- navit/navit/maptool/osm_psql.c | 4 +- navit/navit/maptool/osm_xml.c | 4 +- 8 files changed, 362 insertions(+), 189 deletions(-) diff --git a/navit/navit/maptool/geom.c b/navit/navit/maptool/geom.c index 70df51a..88f0c17 100644 --- a/navit/navit/maptool/geom.c +++ b/navit/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; ix=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;ix-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 || dx=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/navit/maptool/maptool.c b/navit/navit/maptool/maptool.c index 0f5ba00..ce68092 100644 --- a/navit/navit/maptool/maptool.c +++ b/navit/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/navit/maptool/maptool.h b/navit/navit/maptool/maptool.h index d5b3c0d..88873b5 100644 --- a/navit/navit/maptool/maptool.h +++ b/navit/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/navit/maptool/osm.c b/navit/navit/maptool/osm.c index fb8a4f2..f85ac78 100644 --- a/navit/navit/maptool/osm.c +++ b/navit/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>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->typeclen/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/navit/maptool/osm_o5m.c b/navit/navit/maptool/osm_o5m.c index c90f509..cfce3d4 100644 --- a/navit/navit/maptool/osm_o5m.c +++ b/navit/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/navit/maptool/osm_protobuf.c b/navit/navit/maptool/osm_protobuf.c index 0bcf757..b8008e9 100644 --- a/navit/navit/maptool/osm_protobuf.c +++ b/navit/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\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/navit/maptool/osm_psql.c b/navit/navit/maptool/osm_psql.c index 2365e84..f116b41 100644 --- a/navit/navit/maptool/osm_psql.c +++ b/navit/navit/maptool/osm_psql.c @@ -28,7 +28,7 @@ #include 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/navit/maptool/osm_xml.c b/navit/navit/maptool/osm_xml.c index 210632a..164a187 100644 --- a/navit/navit/maptool/osm_xml.c +++ b/navit/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, "",7)) { osm_end_node(out_nodes); } else if (!strncmp(p, "",6)) { - osm_end_way(out_ways); + osm_end_way(out_ways, out_way2poi); } else if (!strncmp(p, "",11)) { osm_end_relation(out_turn_restrictions, out_boundaries); } else if (!strncmp(p, "",6)) { -- 2.7.4