Diff of /trunk/src/osm.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 194 by harbaum, Tue Jul 7 19:31:45 2009 UTC revision 195 by harbaum, Wed Jul 8 08:51:02 2009 UTC
# Line 2238  char *osm_object_type_string(object_t *o Line 2238  char *osm_object_type_string(object_t *o
2238    const struct { type_t type; char *name; } types[] = {    const struct { type_t type; char *name; } types[] = {
2239      { ILLEGAL,     "illegal" },      { ILLEGAL,     "illegal" },
2240      { NODE,        "node" },      { NODE,        "node" },
2241      { WAY,         "way" },      { WAY,         "way/area" },
2242      { RELATION,    "relation" },      { RELATION,    "relation" },
2243      { NODE_ID,     "node id" },      { NODE_ID,     "node id" },
2244      { WAY_ID,      "way id" },      { WAY_ID,      "way/area id" },
2245      { RELATION_ID, "relation id" },      { RELATION_ID, "relation id" },
2246      { 0, NULL }      { 0, NULL }
2247    };    };
# Line 2261  char *osm_object_get_name(object_t *obje Line 2261  char *osm_object_get_name(object_t *obje
2261    return osm_tag_get_by_key(tags, "name");    return osm_tag_get_by_key(tags, "name");
2262  }  }
2263    
2264    /* try to get an as "speaking" description of the object as possible */
2265    char *osm_object_get_speaking_name(object_t *object) {
2266      char *ret = NULL;
2267      tag_t *tags = osm_object_get_tags(object);
2268    
2269      /* worst case: we have no tags at all. return techincal info then */
2270      if(!tags)
2271        return g_strdup_printf("unspecified %s", osm_object_type_string(object));
2272    
2273      /* try to figure out _what_ this is */
2274    
2275      char *name = osm_tag_get_by_key(tags, "name");
2276      if(!name) name = osm_tag_get_by_key(tags, "ref");
2277      if(!name) name = osm_tag_get_by_key(tags, "note");
2278      if(!name) name = osm_tag_get_by_key(tags, "fix" "me");
2279      if(!name) name = osm_tag_get_by_key(tags, "sport");
2280    
2281      /* search for some kind of "type" */
2282      gboolean free_type = FALSE;
2283      char *type = osm_tag_get_by_key(tags, "amenity");
2284      if(!type) type = osm_tag_get_by_key(tags, "place");
2285      if(!type) type = osm_tag_get_by_key(tags, "historic");
2286      if(!type) type = osm_tag_get_by_key(tags, "leisure");
2287      if(!type) type = osm_tag_get_by_key(tags, "tourism");
2288      if(!type) type = osm_tag_get_by_key(tags, "landuse");
2289      if(!type) type = osm_tag_get_by_key(tags, "waterway");
2290      if(!type) type = osm_tag_get_by_key(tags, "railway");
2291      if(!type) type = osm_tag_get_by_key(tags, "natural");
2292      if(!type && osm_tag_get_by_key(tags, "building")) type = "building";
2293    
2294      /* highways are a little bit difficult */
2295      char *highway = osm_tag_get_by_key(tags, "highway");
2296      if(highway) {
2297        if((!strcmp(highway, "primary")) ||
2298           (!strcmp(highway, "secondary")) ||
2299           (!strcmp(highway, "tertiary")) ||
2300           (!strcmp(highway, "unclassified")) ||
2301           (!strcmp(highway, "residential")) ||
2302           (!strcmp(highway, "service"))) {
2303          type = g_strdup_printf("%s road", highway);
2304          free_type = TRUE;
2305        }
2306    
2307        else if(!strcmp(highway, "pedestrian")) {
2308          type = g_strdup_printf("%s way/area", highway);
2309          free_type = TRUE;
2310        }
2311    
2312        else if(!strcmp(highway, "construction")) {
2313          type = g_strdup_printf("road/street under %s", highway);
2314          free_type = TRUE;
2315        }
2316    
2317        else
2318          type = highway;
2319      }
2320    
2321      if(type && name)
2322        ret = g_strdup_printf("%s: \"%s\"", type, name);
2323      else if(type && !name)
2324        ret = g_strdup(type);
2325      else if(name && !type)
2326        ret = g_strdup_printf("%s: \"%s\"",
2327              osm_object_type_string(object), name);
2328      else
2329        ret = g_strdup_printf("unspecified %s", osm_object_type_string(object));
2330    
2331      if(free_type)
2332        g_free(type);
2333    
2334      /* remove underscores from string and replace them by spaces as this is */
2335      /* usually nicer */
2336      char *p = ret;
2337      while(*p) {
2338        if(*p == '_')
2339          *p = ' ';
2340        p++;
2341      }
2342    
2343      return ret;
2344    }
2345    
2346  char *osm_object_string(object_t *object) {  char *osm_object_string(object_t *object) {
2347    char *type_str = osm_object_type_string(object);    char *type_str = osm_object_type_string(object);
2348    
2349    if(!object)    if(!object)
2350      return g_strdup_printf("%s #<invalid>", type_str);      return g_strdup_printf("%s #<invalid>", type_str);
2351    
   char *name = osm_object_get_name(object);  
   if(name)  
     return g_strdup_printf("%s \"%s\"", type_str, name);  
   
2352    switch(object->type) {    switch(object->type) {
2353    case ILLEGAL:    case ILLEGAL:
2354      return g_strdup_printf("%s #<unspec>", type_str);      return g_strdup_printf("%s #<unspec>", type_str);

Legend:
Removed from v.194  
changed lines
  Added in v.195