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; }
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; }