int output_gazetteer_t::gazetteer_process_node(osmid_t id, double lat, double lon, struct keyval *tags, int delete_old)
{
   struct keyval names;
   struct keyval places;
   struct keyval extratags;
   struct keyval *place;
   int adminlevel;
   struct keyval * housenumber;
   struct keyval * street;
   struct keyval * addr_place;
   char * isin;
   struct keyval * postcode;
   struct keyval * countrycode;
   char wkt[128];


   /* Split the tags */
   split_tags(tags, TAGINFO_NODE, &names, &places, &extratags, &adminlevel, &housenumber, &street, &addr_place, &isin, &postcode, &countrycode);

   if (delete_old)
       delete_unused_classes('N', id, &places);

   /* Are we interested in this item? */
   if (keyval::listHasData(&places))
   {
      sprintf(wkt, "POINT(%.15g %.15g)", lon, lat);
      for (place = keyval::firstItem(&places); place; place = keyval::nextItem(&places, place))
      {
         add_place('N', id, place->key, place->value, &names, &extratags, adminlevel, housenumber, street, addr_place, isin, postcode, countrycode, wkt);
      }
   }

   if (housenumber) keyval::freeItem(housenumber);
   if (street) keyval::freeItem(street);
   if (addr_place) keyval::freeItem(addr_place);
   if (isin) free(isin);
   if (postcode) keyval::freeItem(postcode);
   if (countrycode) keyval::freeItem(countrycode);

   /* Free tag lists */
   keyval::resetList(&names);
   keyval::resetList(&places);
   keyval::resetList(&extratags);

   return 0;
}
Exemple #2
0
int main(int argc, char **argv)
{
  char *action;

  if (argc < 2) 
    main_usage(argv[0]);
  
  action = argv[1];
  
  if (carmen_strcasecmp(action, "-h") == 0 || 
      carmen_strcasecmp(action, "--help") == 0) 
    main_usage(argv[0]);
  if (carmen_strcasecmp(action, "help") == 0) {
    help(argc, argv);
    return 0;
  }

  if (carmen_strcasecmp(action, "toppm") == 0)
    toppm(argc, argv);
#ifndef NO_GRAPHICS
  else if (carmen_strcasecmp(action, "tomap") == 0)
    tomap(argc, argv);
#endif
  else if (carmen_strcasecmp(action, "rotate") == 0)
    rotate(argc, argv);
  else if (carmen_strcasecmp(action, "minimize") == 0)
    minimize(argc, argv);
  else if (carmen_strcasecmp(action, "add_place") == 0)
    add_place(argc, argv);
  else if (carmen_strcasecmp(action, "add_offset") == 0)
    add_offset(argc, argv);
  else if (carmen_strcasecmp(action, "strip") == 0)
    strip(argc, argv);
  else if (carmen_strcasecmp(action, "info") == 0)
    info(argc, argv);
  else {
    carmen_warn("\nUnrecognized action %s\n", argv[1]);
    main_usage(argv[0]);
  }

  return 0;
}
int output_gazetteer_t::gazetteer_process_relation(osmid_t id, struct member *members, int member_count, struct keyval *tags, int delete_old)
{
   struct keyval names;
   struct keyval places;
   struct keyval extratags;
   struct keyval *place;
   int adminlevel;
   struct keyval * housenumber;
   struct keyval * street;
   struct keyval * addr_place;
   char * isin;
   struct keyval * postcode;
   struct keyval * countrycode;
   const char *type;
   int cmp_waterway;

   type = keyval::getItem(tags, "type");
   if (!type) {
      if (delete_old) delete_unused_classes('R', id, 0);
      return 0;
   }

   cmp_waterway = strcmp(type, "waterway");

   if (!strcmp(type, "associatedStreet"))
   {
      if (delete_old) delete_unused_classes('R', id, 0);
      return 0;
   }

   if (strcmp(type, "boundary") && strcmp(type, "multipolygon") && cmp_waterway) {
      if (delete_old) delete_unused_classes('R', id, 0);
      return 0;
   }

   /* Split the tags */
   split_tags(tags, TAGINFO_AREA, &names, &places, &extratags, &adminlevel, &housenumber, &street, &addr_place, &isin, &postcode, &countrycode);

   /* reset type to NULL because split_tags() consumes the tags
    * keyval and means that it's pointing to some random stuff
    * which might be harmful if dereferenced. */
   type = NULL;

   if (delete_old)
       delete_unused_classes('R', id, &places);

   if (keyval::listHasData(&places))
   {
      /* get the boundary path (ways) */
      int i, count;
      int *xcount = (int *)malloc( (member_count+1) * sizeof(int) );
      keyval *xtags  = new keyval[member_count+1];
      struct osmNode **xnodes = (struct osmNode **)malloc( (member_count+1) * sizeof(struct osmNode*) );
      osmid_t *xid2 = (osmid_t *)malloc( (member_count+1) * sizeof(osmid_t) );

      count = 0;
      for (i=0; i<member_count; i++)
      {
         /* only interested in ways */
         if (members[i].type != OSMTYPE_WAY)
            continue;
         xid2[count] = members[i].id;
         count++;
      }

      if (count == 0)
      {
          if (delete_old) delete_unused_classes('R', id, 0);
          free(xcount);
          delete [] xtags;
          free(xnodes);
          free(xid2);
          return 0;
      }

      osmid_t *xid = (osmid_t *)malloc( sizeof(osmid_t) * (count + 1));
      count = m_mid->ways_get_list(xid2, count, xid, xtags, xnodes, xcount);

      xnodes[count] = NULL;
      xcount[count] = 0;

      if (cmp_waterway)
      {
         geometry_builder::maybe_wkts_t wkts = builder.build_both(xnodes, xcount, 1, 1, 1000000, id);
         for (geometry_builder::wkt_itr wkt = wkts->begin(); wkt != wkts->end(); ++wkt)
         {
            if ((boost::starts_with(wkt->geom,  "POLYGON") || boost::starts_with(wkt->geom,  "MULTIPOLYGON")))
            {
                for (place = keyval::firstItem(&places); place; place = keyval::nextItem(&places, place))
                {
                   add_place('R', id, place->key, place->value, &names, &extratags, adminlevel, housenumber, street, addr_place,
                             isin, postcode, countrycode, wkt->geom.c_str());
                }
            }
            else
            {
                /* add_polygon_error('R', id, "boundary", "adminitrative", &names, countrycode, wkt); */
            }
         }
      } else {
         /* waterways result in multilinestrings */
         // wkt_t build_multilines(const osmNode * const * xnodes, const int *xcount, osmid_t osm_id) const;
         geometry_builder::maybe_wkt_t wkt = builder.build_multilines(xnodes, xcount, id);
         if ((wkt->geom).length() > 0)
         {
            for (place = keyval::firstItem(&places); place; place = keyval::nextItem(&places, place))
            {
               add_place('R', id, place->key, place->value, &names, &extratags, adminlevel, housenumber, street, addr_place,
                         isin, postcode, countrycode, wkt->geom.c_str());
            }
         }
      }
      for( i=0; i<count; i++ )
      {
         keyval::resetList( &(xtags[i]) );
         free( xnodes[i] );
      }

      free(xid);
      free(xid2);
      free(xcount);
      delete [] xtags;
      free(xnodes);
   }

   if (housenumber) keyval::freeItem(housenumber);
   if (street) keyval::freeItem(street);
   if (addr_place) keyval::freeItem(addr_place);
   if (isin) free(isin);
   if (postcode) keyval::freeItem(postcode);
   if (countrycode) keyval::freeItem(countrycode);

   /* Free tag lists */
   keyval::resetList(&names);
   keyval::resetList(&places);
   keyval::resetList(&extratags);

   return 0;
}
int output_gazetteer_t::gazetteer_process_way(osmid_t id, osmid_t *ndv, int ndc, struct keyval *tags, int delete_old)
{
   struct keyval names;
   struct keyval places;
   struct keyval extratags;
   struct keyval *place;
   int adminlevel;
   struct keyval * housenumber;
   struct keyval * street;
   struct keyval * addr_place;
   char * isin;
   struct keyval * postcode;
   struct keyval * countrycode;
   int area;


   /* Split the tags */
   area = split_tags(tags, TAGINFO_WAY, &names, &places, &extratags, &adminlevel, &housenumber, &street, &addr_place, &isin, &postcode, &countrycode);

   if (delete_old)
       delete_unused_classes('W', id, &places);

   /* Are we interested in this item? */
   if (keyval::listHasData(&places))
   {
      struct osmNode *nodev;
      int nodec;

      /* Fetch the node details */
      nodev = (struct osmNode *)malloc(ndc * sizeof(struct osmNode));
      nodec = m_mid->nodes_get_list(nodev, ndv, ndc);

      /* Get the geometry of the object */
      geometry_builder::maybe_wkt_t wkt = builder.get_wkt_simple(nodev, nodec, area);
      if (wkt)
      {
         for (place = keyval::firstItem(&places); place; place = keyval::nextItem(&places, place))
         {
            add_place('W', id, place->key, place->value, &names, &extratags, adminlevel,
                      housenumber, street, addr_place, isin, postcode, countrycode, wkt->geom.c_str());
         }
      }

      /* Free the nodes */
      free(nodev);
   }

   if (housenumber) keyval::freeItem(housenumber);
   if (street) keyval::freeItem(street);
   if (addr_place) keyval::freeItem(addr_place);
   if (isin) free(isin);
   if (postcode) keyval::freeItem(postcode);
   if (countrycode) keyval::freeItem(countrycode);

   /* Free tag lists */
   keyval::resetList(&names);
   keyval::resetList(&places);
   keyval::resetList(&extratags);

   return 0;
}