包含具有无效位置的节点引用的方式
Way containing NodeRefs with invalid location
我正在用锇解析马约特岛的pbf,我的处理程序正在寻找方法。当我找到一个时,我会处理它的重心并打印出来。我遇到的问题是我处理的所有方式都invalid location
.如果打印位置,我会得到纬度和经度的undefined
。
我的 PBF 文件或我对锇库的理解是否有问题?
这是一个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();
}
在OSM中,一种方法通常只存储对它所组成的节点的引用。这些引用仅包含节点 ID,但不包含其他信息(如坐标和标记(。要获得节点坐标,您必须查看实际节点,而不仅仅是它们的参考。
有关详细信息,请参阅 OSM XML 和 PBF 格式。
由于我没有使用锇的经验,因此无法告诉您如何通过其ID检索相应的节点。但是,根据《锇概念手册》,您可以使用NodeLocationsForWays
处理程序在NodeRef
对象中填充位置。示例/osmium_road_length.cpp包含一个示例。
相关文章:
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 如何在c++中为模板函数实例创建快捷方式
- Boost Graph Library,修复节点大小
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- C++A*算法并不总是在路径中具有目标节点
- 以螺旋方式打印矩阵的程序.(工作不好)
- 如何找到2个单链表的公共节点
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 创建引用向量的优雅方式
- 为什么我的删除节点函数实际上没有删除节点?
- 以递归方式从链表中删除节点
- 以分类方式插入节点时遇到麻烦
- C++ & cocos2dx -- 无法以编程方式添加节点
- 包含具有无效位置的节点引用的方式
- 以私有方式声明的节点
- 保存图节点的最佳方式
- 如何确定'std::map'创建的用于'boost::pool_allocator'的节点的大小(以跨平台方式)?