Add:Core:Initial support for house numbers
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Wed, 10 Dec 2008 13:40:55 +0000 (13:40 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Wed, 10 Dec 2008 13:40:55 +0000 (13:40 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk/navit@1779 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/attr_def.h
navit/data/binfile/binfile.c
navit/item_def.h
navit/navit.xml
navit/osm2navit.c

index 5aca623..42f48d2 100644 (file)
@@ -169,6 +169,7 @@ ATTR(gc_difficulty)
 ATTR(gc_terrain)
 ATTR(icon_src)
 ATTR(position_time_iso8601)
+ATTR(house_number)
 ATTR2(0x0003ffff,type_string_end)
 ATTR2(0x00040000,type_special_begin)
 ATTR(order)
index c2d871e..d37dbd3 100644 (file)
@@ -77,7 +77,7 @@ struct map_rect_priv {
        int *end;
        enum attr_type attr_last;
        int label;
-       int *label_attr[2];
+       int *label_attr[4];
         struct map_selection *sel;
         struct map_priv *m;
         struct item item;
@@ -367,12 +367,14 @@ binfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr)
                type=le32_to_cpu(t->pos_attr[0]);
                if (type == attr_label) 
                        mr->label=1;
-               if (type == attr_town_name)
+               if (type == attr_house_number)
                        mr->label_attr[0]=t->pos_attr;
                if (type == attr_street_name)
-                       mr->label_attr[0]=t->pos_attr;
-               if (type == attr_street_name_systematic)
                        mr->label_attr[1]=t->pos_attr;
+               if (type == attr_street_name_systematic)
+                       mr->label_attr[2]=t->pos_attr;
+               if (type == attr_town_name)
+                       mr->label_attr[3]=t->pos_attr;
                if (type == attr_type || attr_type == attr_any) {
                        if (attr_type == attr_any) {
                                dbg(1,"pos %p attr %s size %d\n", t->pos_attr-1, attr_to_name(type), size);
index 35b652a..cd32312 100644 (file)
@@ -298,6 +298,7 @@ ITEM(poi_baseball)
 ITEM(poi_climbing)
 ITEM(poi_motor_sport)
 ITEM(poi_tennis)
+ITEM(house_number)
 /* Line */
 ITEM2(0x80000000,line)
 ITEM2(0x80000001,line_unspecified)
@@ -402,6 +403,10 @@ ITEM(tracking_80)
 ITEM(tracking_90)
 ITEM(tracking_100)
 ITEM(track_tracked)
+ITEM(house_number_interpolation_even)
+ITEM(house_number_interpolation_odd)
+ITEM(house_number_interpolation_all)
+ITEM(house_number_interpolation_alphabetic)
 /* Area */
 ITEM2(0xc0000000,area)
 ITEM2(0xc0000001,area_unspecified)
index dbb25ec..0e4edfe 100644 (file)
                 </itemgra>
             </layer>
             <layer name="labels">
+               <itemgra item_types="house_number" order="15-">
+                       <circle color="#000000" radius="3" text_size="7"/>
+               </itemgra>
                 <itemgra item_types="town_label,district_label,town_label_0e0,town_label_1e0,town_label_2e0,town_label_5e0,town_label_1e1,town_label_2e1,town_label_5e1,town_label_1e2,town_label_2e2,town_label_5e2,district_label_0e0,district_label_1e0,district_label_2e0,district_label_5e0,district_label_1e1,district_label_2e1,district_label_5e1,district_label_1e2,district_label_2e2,district_label_5e2" order="12-">
                     <circle color="#000000" radius="3" text_size="7"/>
                 </itemgra>
index df436c0..2c485dc 100644 (file)
@@ -61,6 +61,9 @@ static int ignore_unkown = 0, coverage=0;
 static char *attrmap={
        "n      *=*                     point_unkn\n"
        "n      Annehmlichkeit=Hochsitz poi_hunting_stand\n"
+#ifdef HOUSE_NUMBERS
+       "n      addr:housenumber=*      house_number\n"
+#endif
        "n      aeroway=aerodrome       poi_airport\n"
        "n      aeroway=airport         poi_airport\n"
        "n      aeroway=helipad         poi_heliport\n"
@@ -172,6 +175,12 @@ static char *attrmap={
        "n      tourism=viewpoint       poi_viewpoint\n"
        "n      tourism=zoo             poi_zoo\n"
        "w      *=*                     street_unkn\n"
+#ifdef HOUSE_NUMBERS
+       "w      addr:interpolation=even house_number_interpolation_even\n"
+       "w      addr:interpolation=odd  house_number_interpolation_odd\n"
+       "w      addr:interpolation=all  house_number_interpolation_all\n"
+       "w      addr:interpolation=alphabetic   house_number_interpolation_alphabetic\n"
+#endif
        "w      aerialway=cable_car     lift_cable_car\n"
        "w      aerialway=chair_lift    lift_chair\n"
        "w      aerialway=drag_lift     lift_drag\n"
@@ -537,6 +546,14 @@ struct attr_bin label_attr = {
 };
 char label_attr_buffer[BUFFER_SIZE];
 
+#ifdef HOUSE_NUMBERS
+struct attr_bin house_number_attr = {
+       0, attr_house_number
+};
+char house_number_attr_buffer[BUFFER_SIZE];
+#endif
+
+
 struct attr_bin town_name_attr = {
        0, attr_town_name
 };
@@ -545,6 +562,10 @@ struct attr_bin street_name_attr = {
        0, attr_street_name
 };
 
+#ifdef HOUSE_NUMBERS
+char street_name_attr_buffer[BUFFER_SIZE];
+#endif
+
 struct attr_bin street_name_systematic_attr = {
        0, attr_street_name_systematic
 };
@@ -665,6 +686,16 @@ add_tag(char *k, char *v)
                pad_text_attr(&label_attr, label_attr_buffer);
                level=5;
        }
+#ifdef HOUSE_NUMBERS
+       if (! strcmp(k,"addr:housenumber")) {
+               strcpy(house_number_attr_buffer, v);
+               pad_text_attr(&house_number_attr, house_number_attr_buffer);
+       }
+       if (! strcmp(k,"addr:street")) {
+               strcpy(street_name_attr_buffer, v);
+               pad_text_attr(&street_name_attr, street_name_attr_buffer);
+       }
+#endif
        if (! strcmp(k,"ref")) {
                if (in_way) {
                        strcpy(street_name_systematic_attr_buffer, v);
@@ -843,6 +874,10 @@ add_node(int id, double lat, double lon)
        nodeid=id;
        item.type=type_point_unkn;
        label_attr.len=0;
+#ifdef HOUSE_NUMBERS
+       house_number_attr.len=0;
+       street_name_attr.len=0;
+#endif
        town_name_attr.len=0;
        debug_attr.len=0;
        is_in_buffer[0]='\0';
@@ -956,6 +991,9 @@ add_way(int id)
        coord_count=0;
        item.type=type_street_unkn;
        label_attr.len=0;
+#ifdef HOUSE_NUMBERS
+       house_number_attr.len=0;
+#endif
        street_name_attr.len=0;
        street_name_systematic_attr.len=0;
        debug_attr.len=0;
@@ -1114,6 +1152,12 @@ end_node(FILE *out)
                alen+=label_attr.len+1;
        if (debug_attr.len)
                alen+=debug_attr.len+1;
+#ifdef HOUSE_NUMBERS
+       if (house_number_attr.len)
+               alen+=house_number_attr.len+1;
+       if (street_name_attr.len)
+               alen+=street_name_attr.len+1;
+#endif
        if (count)
                item.type=types[0];
        else
@@ -1127,6 +1171,10 @@ end_node(FILE *out)
                write_attr(out, &town_name_attr, label_attr_buffer);
        } else
                write_attr(out, &label_attr, label_attr_buffer);
+#ifdef HOUSE_NUMBERS
+       write_attr(out, &house_number_attr, house_number_attr_buffer);
+       write_attr(out, &street_name_attr, street_name_attr_buffer);
+#endif
        write_attr(out, &debug_attr, debug_attr_buffer);
 #ifdef GENERATE_INDEX
        if (item_is_town(item) && town_name_attr.len) {
@@ -2831,7 +2879,6 @@ int main(int argc, char **argv)
                        phase1_db(dbstr,ways,nodes);
                else
 #endif
-               printf("map_handle=%p\n", map_handle);
                if (map_handle) {
                        phase1_map(map_handle,ways,nodes);
                        map_destroy(map_handle);