int output_gazetteer_t::process_node(osmid_t id, double lat, double lon, const taglist_t &tags) { places.process_tags(tags); if (m_options.append) delete_unused_classes('N', id); /* Are we interested in this item? */ if (places.has_data()) { std::string wkt = (point_fmt % lon % lat).str(); places.copy_out('N', id, wkt, buffer); flush_place_buffer(); } return 0; }
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 output_gazetteer_t::process_way(osmid_t id, const idlist_t &nds, const taglist_t &tags) { places.process_tags(tags); if (m_options.append) delete_unused_classes('W', id); /* Are we interested in this item? */ if (places.has_data()) { /* Fetch the node details */ nodelist_t nodes; m_mid->nodes_get_list(nodes, nds); /* Get the geometry of the object */ auto geom = builder.get_wkb_simple(nodes, 1); if (geom.valid()) { places.copy_out('W', id, geom.geom, buffer); flush_place_buffer(); } } return 0; }
int output_gazetteer_t::process_relation(osmid_t id, const memberlist_t &members, const taglist_t &tags) { const std::string *type = tags.get("type"); if (!type) { delete_unused_full('R', id); return 0; } int cmp_waterway = type->compare("waterway"); if (*type == "associatedStreet" || !(*type == "boundary" || *type == "multipolygon" || !cmp_waterway)) { delete_unused_full('R', id); return 0; } places.process_tags(tags); if (m_options.append) delete_unused_classes('R', id); /* Are we interested in this item? */ if (!places.has_data()) return 0; /* get the boundary path (ways) */ idlist_t xid2; for (const auto& member: members) { /* only interested in ways */ if (member.type == OSMTYPE_WAY) xid2.push_back(member.id); } if (xid2.empty()) { if (m_options.append) delete_unused_full('R', id); return 0; } multitaglist_t xtags; multinodelist_t xnodes; idlist_t xid; m_mid->ways_get_list(xid2, xid, xtags, xnodes); if (cmp_waterway) { auto geoms = builder.build_both(xnodes, 1, 1, 1000000, id); for (const auto& geom: geoms) { if (geom.is_polygon()) { places.copy_out('R', id, geom.geom, buffer); flush_place_buffer(); } else { /* add_polygon_error('R', id, "boundary", "adminitrative", &names, countrycode, wkt); */ } } } else { /* waterways result in multilinestrings */ auto geom = builder.build_multilines(xnodes, id); if (geom.valid()) { places.copy_out('R', id, geom.geom, buffer); flush_place_buffer(); } } return 0; }
int output_gazetteer_t::process_relation(osmid_t id, const memberlist_t &members, const taglist_t &tags) { const std::string *type = tags.get("type"); if (!type) { delete_unused_full('R', id); return 0; } int cmp_waterway = type->compare("waterway"); if (*type == "associatedStreet" || !(*type == "boundary" || *type == "multipolygon" || !cmp_waterway)) { delete_unused_full('R', id); return 0; } places.process_tags(tags); if (m_options.append) delete_unused_classes('R', id); /* Are we interested in this item? */ if (!places.has_data()) return 0; /* get the boundary path (ways) */ idlist_t xid2; for (memberlist_t::const_iterator it = members.begin(); it != members.end(); ++it) { /* only interested in ways */ if (it->type == OSMTYPE_WAY) xid2.push_back(it->id); } if (xid2.empty()) { if (m_options.append) delete_unused_full('R', id); return 0; } multitaglist_t xtags; multinodelist_t xnodes; idlist_t xid; m_mid->ways_get_list(xid2, xid, xtags, xnodes); if (cmp_waterway) { geometry_builder::maybe_wkts_t wkts = builder.build_both(xnodes, 1, 1, 1000000, id); for (const auto& wkt: *wkts) { if (boost::starts_with(wkt.geom, "POLYGON") || boost::starts_with(wkt.geom, "MULTIPOLYGON")) { places.copy_out('R', id, wkt.geom, buffer); flush_place_buffer(); } else { /* add_polygon_error('R', id, "boundary", "adminitrative", &names, countrycode, wkt); */ } } } else { /* waterways result in multilinestrings */ geometry_builder::maybe_wkt_t wkt = builder.build_multilines(xnodes, id); if ((wkt->geom).length() > 0) { places.copy_out('R', id, wkt->geom, buffer); flush_place_buffer(); } } 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; }