void ImportErrorReporter::ReportRelation(OSMId id, const TypeInfoRef& type, const std::string& error) { std::unique_lock <std::mutex> lock(mutex); ObjectOSMRef object(id,osmRefRelation); std::string name; if (!type->GetIgnore()) { name=object.GetName()+" ("+type->GetName()+")"; } else { name=object.GetName(); } progress.Warning(name+" - "+error); relationReport.WriteListEntryStart(); relationReport.WriteOSMObjectLink(object,name); relationReport.WriteText(" - "); relationReport.WriteText(error); relationReport.WriteListEntryEnd(); relationErrorCount++; }
void Preprocess::Callback::ProcessMultipolygon(const TagMap& tags, const std::vector<RawRelation::Member>& members, OSMId id, const TypeInfoRef& type) { RawRelation relation; areaStat[type->GetIndex()]++; relation.SetId(id); if (type->GetIgnore()) { relation.SetType(typeConfig->typeInfoIgnore); } else { relation.SetType(type); } relation.members=members; relation.Parse(progress, *typeConfig, tags); relation.Write(*typeConfig, multipolygonWriter); multipolygonCount++; }
bool Preprocess::Callback::IsMultipolygon(const TagMap& tags, TypeInfoRef& type) { type=typeConfig->GetRelationType(tags); if (type!=typeConfig->typeInfoIgnore && type->GetIgnore()) { return false; } bool isArea=type!=typeConfig->typeInfoIgnore && type->GetMultipolygon(); if (!isArea) { auto typeTag=tags.find(typeConfig->tagType); isArea=typeTag!=tags.end() && typeTag->second=="multipolygon"; } return isArea; }
void Preprocess::Callback::ProcessWay(const OSMId& id, std::vector<OSMId>& nodes, const TagMap& tagMap) { TypeInfoRef areaType; TypeInfoRef wayType; int isArea=0; // 0==unknown, 1==true, -1==false bool isCoastlineArea=false; RawWay way; bool isCoastline=false; if (nodes.size()<2) { progress.Warning("Way "+ NumberToString(id)+ " has less than two nodes!"); return; } if (id<lastWayId) { waySortingError=true; } way.SetId(id); auto areaTag=tagMap.find(typeConfig->tagArea); if (areaTag==tagMap.end()) { isArea=0; } else if (areaTag->second=="no" || areaTag->second=="false" || areaTag->second=="0") { isArea=-1; } else { isArea=1; } auto naturalTag=tagMap.find(typeConfig->tagNatural); if (naturalTag!=tagMap.end() && naturalTag->second=="coastline") { isCoastline=true; } if (isCoastline) { isCoastlineArea=nodes.size()>3 && (nodes.front()==nodes.back() || isArea==1); } typeConfig->GetWayAreaType(tagMap, wayType, areaType); if (isArea==1 && areaType==typeConfig->typeInfoIgnore) { isArea=0; } else if (isArea==-1 && wayType==typeConfig->typeInfoIgnore) { isArea=0; } if (isArea==0) { if (wayType!=typeConfig->typeInfoIgnore && areaType==typeConfig->typeInfoIgnore) { isArea=-1; } else if (wayType==typeConfig->typeInfoIgnore && areaType!=typeConfig->typeInfoIgnore) { isArea=1; } else if (wayType!=typeConfig->typeInfoIgnore && areaType!=typeConfig->typeInfoIgnore) { if (nodes.size()>3 && nodes.front()==nodes.back()) { if (wayType->GetPinWay()) { isArea=-1; } else { isArea=1; } } else { isArea=-1; } } } switch (isArea) { case 1: areaStat[areaType->GetIndex()]++; if (areaType->GetIgnore()) { way.SetType(typeConfig->typeInfoIgnore, true); } else { way.SetType(areaType,true); } if (nodes.size()>3 && nodes.front()==nodes.back()) { nodes.pop_back(); } areaCount++; break; case -1: wayStat[wayType->GetIndex()]++; if (wayType->GetIgnore()) { way.SetType(typeConfig->typeInfoIgnore,false); } else { way.SetType(wayType,false); } wayCount++; break; default: if (nodes.size()>3 && nodes.front()==nodes.back()) { areaStat[typeIgnore]++; way.SetType(typeConfig->typeInfoIgnore, true); nodes.pop_back(); areaCount++; } else { wayStat[typeIgnore]++; way.SetType(typeConfig->typeInfoIgnore, false); wayCount++; } } way.SetNodes(nodes); way.Parse(progress, *typeConfig, tagMap); way.Write(*typeConfig, wayWriter); lastWayId=id; if (isCoastline) { RawCoastline coastline; coastline.SetId(way.GetId()); coastline.SetType(isCoastlineArea); coastline.SetNodes(way.GetNodes()); coastline.Write(coastlineWriter); coastlineCount++; } }