summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-08-01 19:57:22 +0000
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-08-01 19:57:22 +0000
commit284e4afc79de01246a10c5059c9782bea679fb3b (patch)
tree3dba18189c6a373c651dd91d2ef2d3081ac7e1f9
parent4a6919e991d856c108fcd6eb53673666fb2c1e0a (diff)
downloadnavit-284e4afc79de01246a10c5059c9782bea679fb3b.tar.gz
Add:maptool:Experimental support for adding county and municipality information
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@4671 ffa7fe5e-494d-0410-b361-a75ebd5db220
-rw-r--r--navit/maptool/boundaries.c2
-rw-r--r--navit/maptool/maptool.c2
-rw-r--r--navit/maptool/maptool.h2
-rw-r--r--navit/maptool/osm.c63
4 files changed, 62 insertions, 7 deletions
diff --git a/navit/maptool/boundaries.c b/navit/maptool/boundaries.c
index 249d94a9b..95599ccd9 100644
--- a/navit/maptool/boundaries.c
+++ b/navit/maptool/boundaries.c
@@ -20,7 +20,7 @@
#include <string.h>
#include "maptool.h"
-static char *
+char *
osm_tag_value(struct item_bin *ib, char *key)
{
char *tag=NULL;
diff --git a/navit/maptool/maptool.c b/navit/maptool/maptool.c
index 9381eb79f..065783a99 100644
--- a/navit/maptool/maptool.c
+++ b/navit/maptool/maptool.c
@@ -803,10 +803,12 @@ int main(int argc, char **argv)
exit(0);
}
}
+#if 0
if (experimental) {
fprintf(stderr,"No experimental features available\n");
exit(0);
}
+#endif
if (optind != argc-(p.output == 1 ? 0:1))
usage(stderr);
p.result=argv[optind];
diff --git a/navit/maptool/maptool.h b/navit/maptool/maptool.h
index 28731894c..1ffc1f19d 100644
--- a/navit/maptool/maptool.h
+++ b/navit/maptool/maptool.h
@@ -126,6 +126,8 @@ struct boundary {
struct rect r;
};
+char *osm_tag_value(struct item_bin *ib, char *key);
+
osmid boundary_relid(struct boundary *b);
GList *process_boundaries(FILE *boundaries, FILE *ways);
diff --git a/navit/maptool/osm.c b/navit/maptool/osm.c
index 4bd2c7175..7acd5490c 100644
--- a/navit/maptool/osm.c
+++ b/navit/maptool/osm.c
@@ -106,6 +106,7 @@ char *osm_types[]={"unknown","node","way","relation"};
struct country_table {
int countryid;
char *names;
+ char *admin_levels;
FILE *file;
int size;
struct rect r;
@@ -193,7 +194,7 @@ struct country_table {
{ 268,"Georgia"},
{ 270,"Gambia"},
{ 275,"Palestinian Territory, Occupied"},
- { 276,"Germany,Deutschland,Bundesrepublik Deutschland"},
+ { 276,"Germany,Deutschland,Bundesrepublik Deutschland","345c7m"},
{ 288,"Ghana"},
{ 292,"Gibraltar"},
{ 296,"Kiribati"},
@@ -1538,7 +1539,7 @@ relation_add_tag(char *k, char *v)
} else if (!strcmp(k,"admin_level")) {
admin_level=atoi(v);
} else if (!strcmp(k,"boundary")) {
- if (!strcmp(v,"administrative")) {
+ if (!strcmp(v,"administrative") || (experimental && !strcmp(v,"postal_code"))) {
boundary=1;
}
} else if (!strcmp(k,"ISO3166-1")) {
@@ -1764,7 +1765,7 @@ osm_process_town_by_is_in(struct item_bin *ib,char *is_in)
}
static struct country_table *
-osm_process_town_by_boundary(GList *bl, struct item_bin *ib, struct coord *c)
+osm_process_town_by_boundary(GList *bl, struct item_bin *ib, struct coord *c, struct attr *attrs)
{
GList *l,*matches=boundary_find_matches(bl, c);
struct boundary *match=NULL;
@@ -1782,9 +1783,46 @@ osm_process_town_by_boundary(GList *bl, struct item_bin *ib, struct coord *c)
}
l=g_list_next(l);
}
- if (match)
+ if (match) {
+ if (match && match->country && match->country->admin_levels && experimental) {
+ l=matches;
+ while (l) {
+ struct boundary *b=l->data;
+ char *admin_level=osm_tag_value(b->ib, "admin_level");
+ char *postal=osm_tag_value(b->ib, "postal_code");
+ if (admin_level) {
+ int a=atoi(admin_level);
+ int end=strlen(match->country->admin_levels)+3;
+ char *name;
+ if (a > 2 && a < end) {
+ enum attr_type attr_type=attr_none;
+ switch(match->country->admin_levels[a-3]) {
+ case 's':
+ attr_type=attr_state_name;
+ break;
+ case 'c':
+ attr_type=attr_county_name;
+ break;
+ case 'm':
+ attr_type=attr_municipality_name;
+ break;
+ }
+ name=osm_tag_value(b->ib, "name");
+ if (name && attr_type != attr_none) {
+ attrs[a-2].type=attr_type;
+ attrs[a-2].u.str=name;
+ }
+ }
+ }
+ if (postal) {
+ attrs[0].type=attr_town_postal;
+ attrs[0].u.str=postal;
+ }
+ l=g_list_next(l);
+ }
+ }
return match->country;
- else
+ } else
return NULL;
}
@@ -1793,13 +1831,17 @@ osm_process_towns(FILE *in, FILE *boundaries, FILE *ways)
{
struct item_bin *ib;
GList *bl=NULL;
+ struct attr attrs[10];
bl=process_boundaries(boundaries, ways);
while ((ib=read_item(in))) {
struct coord *c=(struct coord *)(ib+1);
struct country_table *result=NULL;
char *is_in=item_bin_get_attr(ib, attr_osm_is_in, NULL);
- result=osm_process_town_by_boundary(bl, ib, c);
+ int i;
+
+ memset(attrs, 0, sizeof(attrs));
+ result=osm_process_town_by_boundary(bl, ib, c, attrs);
if (!result)
result=osm_process_town_by_is_in(ib, is_in);
if (!result && unknown_country)
@@ -1817,6 +1859,15 @@ osm_process_towns(FILE *in, FILE *boundaries, FILE *ways)
nodeid=item_bin_get_attr(ib, attr_osm_nodeid, NULL);
if (nodeid)
item_bin_remove_attr(ib, nodeid);
+ if (attrs[0].type != attr_none) {
+ char *postal=item_bin_get_attr(ib, attr_town_postal, NULL);
+ if (postal)
+ item_bin_remove_attr(ib, postal);
+ }
+ for (i = 0 ; i < 10 ; i++) {
+ if (attrs[i].type != attr_none)
+ item_bin_add_attr(ib, &attrs[i]);
+ }
item_bin_write_match(ib, attr_town_name, attr_town_name_match, result->file);
}
}