int output_pgsql_t::relation_add(osmid_t id, const memberlist_t &members, const taglist_t &tags) { const std::string *type = tags.get("type"); /* Must have a type field or we ignore it */ if (!type) return 0; /* Only a limited subset of type= is supported, ignore other */ if ( (*type != "route") && (*type != "multipolygon") && (*type != "boundary")) return 0; return pgsql_process_relation(id, members, tags, 0); }
void place_tag_processor::process_tags(const taglist_t &tags) { bool placeadmin = false; bool placehouse = false; bool placebuilding = false; const tag_t *place = 0; const tag_t *junction = 0; const tag_t *landuse = 0; bool isnamed = false; bool isinterpolation = false; const std::string *house_nr = 0; const std::string *conscr_nr = 0; const std::string *street_nr = 0; clear(); src = &tags; for (const auto& item: tags) { if (boost::ends_with(item.key, "source")) { // ignore } else if (item.key == "name:prefix" || item.key == "name:botanical" || boost::ends_with(item.key, "wikidata")) { extratags.push_back(&item); } else if (item.key == "ref" || item.key == "int_ref" || item.key == "nat_ref" || item.key == "reg_ref" || item.key == "loc_ref" || item.key == "old_ref" || item.key == "iata" || item.key == "icao" || item.key == "operator" || item.key == "pcode" || boost::starts_with(item.key, "pcode:")) { names.push_back(&item); } else if (item.key == "name" || boost::starts_with(item.key, "name:") || item.key == "int_name" || boost::starts_with(item.key, "int_name:") || item.key == "nat_name" || boost::starts_with(item.key, "nat_name:") || item.key == "reg_name" || boost::starts_with(item.key, "reg_name:") || item.key == "loc_name" || boost::starts_with(item.key, "loc_name:") || item.key == "old_name" || boost::starts_with(item.key, "old_name:") || item.key == "alt_name" || boost::starts_with(item.key, "alt_name:") || boost::starts_with(item.key, "alt_name_") || item.key == "official_name" || boost::starts_with(item.key, "official_name:") || item.key == "place_name" || boost::starts_with(item.key, "place_name:") || item.key == "short_name" || boost::starts_with(item.key, "short_name:") || item.key == "brand") { names.push_back(&item); isnamed = true; } else if (item.key == "addr:housename") { names.push_back(&item); placehouse = true; } else if (item.key == "emergency") { if (item.value != "fire_hydrant" && item.value != "yes" && item.value != "no") places.push_back(item); } else if (item.key == "tourism" || item.key == "historic" || item.key == "military") { if (item.value != "no" && item.value != "yes") places.push_back(item); } else if (item.key == "natural") { if (item.value != "no" && item.value != "yes" && item.value != "coastline") places.push_back(item); } else if (item.key == "landuse") { if (item.value == "cemetry") places.push_back(item); else landuse = &item; } else if (item.key == "highway") { if (item.value == "footway") { auto *footway = tags.get("footway"); if (footway == nullptr || *footway != "sidewalk") places.push_back(item); } else if (item.value != "no" && item.value != "turning_circle" && item.value != "mini_roundabout" && item.value != "noexit" && item.value != "crossing") places.push_back(item); } else if (item.key == "railway") { if (item.value != "level_crossing" && item.value != "no") places.push_back(item); } else if (item.key == "man_made") { if (item.value != "survey_point" && item.value != "cutline") places.push_back(item); } else if (item.key == "aerialway") { if (item.value != "pylon" && item.value != "no") places.push_back(item); } else if (item.key == "boundary") { if (item.value == "administrative") placeadmin = true; places.push_back(item); } else if (item.key == "aeroway" || item.key == "amenity" || item.key == "boundary" || item.key == "bridge" || item.key == "craft" || item.key == "leisure" || item.key == "office" || item.key == "shop" || item.key == "tunnel" || item.key == "mountain_pass") { if (item.value != "no") { places.push_back(item); } } else if (item.key == "waterway") { if (item.value != "riverbank") places.push_back(item); } else if (item.key == "place") { place = &item; } else if (item.key == "junction") { junction = &item; } else if (item.key == "addr:interpolation") { housenumber.clear(); escape(item.value, housenumber); isinterpolation = true; } else if (item.key == "addr:housenumber") { house_nr = &item.value; placehouse = true; } else if (item.key == "addr:conscriptionnumber") { conscr_nr = &item.value; placehouse = true; } else if (item.key == "addr:streetnumber") { street_nr = &item.value; placehouse = true; } else if (item.key == "addr:street") { street = &item.value; } else if (item.key == "addr:place") { addr_place = &item.value; } else if (item.key == "postal_code" || item.key == "postcode" || item.key == "addr:postcode" || item.key == "tiger:zip_left" || item.key == "tiger:zip_right") { if (!postcode) postcode = &item.value; } else if (item.key == "country_code" || item.key == "ISO3166-1" || item.key == "is_in:country_code" || item.key == "addr:country" || item.key == "addr:country_code") { if (item.value.length() == 2) countrycode = &item.value; } else if (boost::starts_with(item.key, "addr:") || item.key == "is_in" || boost::starts_with(item.key, "is_in:") || item.key == "tiger:county") { address.push_back(&item); } else if (item.key == "admin_level") { admin_level = atoi(item.value.c_str()); if (admin_level <= 0 || admin_level > 100) admin_level = 100; } else if (item.key == "tracktype" || item.key == "traffic_calming" || item.key == "service" || item.key == "cuisine" || item.key == "capital" || item.key == "dispensing" || item.key == "religion" || item.key == "denomination" || item.key == "sport" || item.key == "internet_access" || item.key == "lanes" || item.key == "surface" || item.key == "smoothness" || item.key == "width" || item.key == "est_width" || item.key == "incline" || item.key == "opening_hours" || item.key == "collection_times" || item.key == "service_times" || item.key == "disused" || item.key == "wheelchair" || item.key == "sac_scale" || item.key == "trail_visibility" || item.key == "mtb:scale" || item.key == "mtb:description" || item.key == "wood" || item.key == "drive_through" || item.key == "drive_in" || item.key == "access" || item.key == "vehicle" || item.key == "bicyle" || item.key == "foot" || item.key == "goods" || item.key == "hgv" || item.key == "motor_vehicle" || item.key == "motor_car" || boost::starts_with(item.key, "access:") || boost::starts_with(item.key, "contact:") || boost::starts_with(item.key, "drink:") || item.key == "oneway" || item.key == "date_on" || item.key == "date_off" || item.key == "day_on" || item.key == "day_off" || item.key == "hour_on" || item.key == "hour_off" || item.key == "maxweight" || item.key == "maxheight" || item.key == "maxspeed" || item.key == "fee" || item.key == "toll" || boost::starts_with(item.key, "toll:") || item.key == "charge" || item.key == "population" || item.key == "description" || item.key == "image" || item.key == "attribution" || item.key == "fax" || item.key == "email" || item.key == "url" || item.key == "website" || item.key == "phone" || item.key == "real_ale" || item.key == "smoking" || item.key == "food" || item.key == "camera" || item.key == "brewery" || item.key == "locality" || item.key == "wikipedia" || boost::starts_with(item.key, "wikipedia:")) { extratags.push_back(&item); } else if (item.key == "building") { placebuilding = true; } } // skip some tags, if they don't have a proper name (ref doesn't count) if (!isnamed) { if (!places.empty()) places.erase(std::remove_if(places.begin(), places.end(), UnnamedPredicate()), places.end()); } if (isinterpolation) places.push_back(tag_t("place", "houses")); if (place) { if (isinterpolation || (placeadmin && place ->value != "island" && place ->value != "islet")) extratags.push_back(place); else places.push_back(*place); } if (isnamed && places.empty()) { if (junction) places.push_back(*junction); else if (landuse) places.push_back(*landuse); } if (places.empty()) { if (placebuilding && (!names.empty() || placehouse || postcode)) { places.push_back(tag_t("building", "yes")); } else if (placehouse) { places.push_back(tag_t("place", "house")); } else if (postcode) { places.push_back(tag_t("place", "postcode")); } } // housenumbers if (!isinterpolation) { if (street_nr && conscr_nr) { housenumber.clear(); escape(*conscr_nr, housenumber); housenumber.append("/"); escape(*street_nr, housenumber); } else if (conscr_nr) { housenumber.clear(); escape(*conscr_nr, housenumber); } else if (street_nr) { housenumber.clear(); escape(*street_nr, housenumber); } else if (house_nr) { housenumber.clear(); escape(*house_nr, housenumber); } } }
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; }