Add:maptool:Add POIs for OSM way objects if appropriate|Thanks tryagain
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Tue, 5 Jul 2011 13:20:53 +0000 (13:20 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Tue, 5 Jul 2011 13:20:53 +0000 (13:20 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4582 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/maptool/geom.c
navit/navit/maptool/maptool.c
navit/navit/maptool/maptool.h
navit/navit/maptool/osm.c
navit/navit/maptool/osm_o5m.c
navit/navit/maptool/osm_protobuf.c
navit/navit/maptool/osm_psql.c
navit/navit/maptool/osm_xml.c

index 70df51a..88f0c17 100644 (file)
@@ -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)
 {
index 0f5ba00..ce68092 100644 (file)
@@ -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");
index d5b3c0d..88873b5 100644 (file)
@@ -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 */
index fb8a4f2..f85ac78 100644 (file)
@@ -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;
index c90f509..cfce3d4 100644 (file)
@@ -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);
index 0bcf757..b8008e9 100644 (file)
@@ -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;
index 2365e84..f116b41 100644 (file)
@@ -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);
index 210632a..164a187 100644 (file)
@@ -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)) {