我正在用解析mayotte pbf,我的处理程序正在寻找方法。当我找到一个时,便对其重心进行处理并打印。我遇到的问题是,我处理的所有方式都有invalid location
。而且,如果打印位置,则我的经纬度均为undefined
。
我的PBF文件或对osmium library的理解是否存在问题?
这是一个mcve:
/**
* To compile this script, you should first install `libosmium` and its
* dependencies. Then:
* g++ -std=c++11 -lz -lexpat -lbz2 mcve.cpp -o mcve
*/
#include <iostream>
#include <osmium/handler.hpp>
#include <osmium/io/any_input.hpp>
#include <osmium/osm/node.hpp>
#include <osmium/osm/way.hpp>
#include <osmium/visitor.hpp>
class ParkingAndCarpoolingAreasHandler : public osmium::handler::Handler {
public:
void way(const osmium::Way& way) {
double lng;
double lat;
double count = 0.0;
for (const osmium::NodeRef& nr : way.nodes()) {
if (!nr.location().valid()) {
std::cerr << "Way (id=" << way.id()
<< " version=" << way.version()
<< " timestamp=" << way.timestamp()
<< " visible=" << (way.visible() ? "true" : "false")
<< " changeset=" << way.changeset()
<< " uid=" << way.uid()
<< " user=" << way.user() << ")\n";
std::cerr << "NodeRef (ref=" << nr.ref() << " location=" << nr.location() << ")\n";
std::cerr << std::endl;
return;
}
count++;
lng += nr.location().lon();
lat += nr.location().lat();
}
lng /= count;
lat /= count;
std::cout << "POINT(" << lat << ' ' << lng << ")\n";
}
};
int main() {
auto otypes = osmium::osm_entity_bits::node | osmium::osm_entity_bits::way;
osmium::io::Reader reader{"tmp/mayotte-latest.osm.pbf", otypes};
ParkingAndCarpoolingAreasHandler handler;
osmium::apply(reader, handler);
reader.close();
}
答案 0 :(得分:2)
在OSM中,一种方法通常仅存储对其所组成的节点的引用。这些引用仅包含节点ID,但不包含其他信息(例如坐标和标签)。要获取节点坐标,您必须查看实际节点,而不仅仅是参考它们。
有关更多信息,请参见OSM XML和PBF Format。
由于我没有使用osmium的经验,所以无法告诉您如何通过其ID检索相应的节点。但是,根据Osmium Concepts Manual,您可以使用NodeLocationsForWays
处理程序用位置填充NodeRef
对象。 examples/osmium_road_length.cpp包含一个示例。