首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含位置无效的NodeRefs的方式

包含位置无效的NodeRefs的方式
EN

Stack Overflow用户
提问于 2019-04-17 16:19:59
回答 1查看 477关注 0票数 4

我正在使用osmium解析mayotte pbf,而我的处理程序正在寻找方法。当我找到一个时,我会处理它的重心并打印出来。我遇到的问题是,我处理的所有方法都有invalid location。如果打印位置,我会得到纬度和经度的undefined

是我的PBF文件有问题,还是我对osmium library的理解有问题?

下面是一个mcve:

代码语言:javascript
复制
/**
 * 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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-17 16:38:05

在OSM中,一个方法通常只存储对它所组成的节点的引用。这些引用只包含节点ID,而不包含其他信息(如坐标和标记)。要获得节点坐标,您必须查看实际节点,而不仅仅是它们的引用。

有关详细信息,请参阅OSM XMLPBF Format

因为我没有使用osmium的经验,所以我不能告诉您如何根据节点的I检索相应的节点。但是,根据Osmium Concepts Manual,您可以使用NodeLocationsForWays处理程序用位置填充NodeRef对象。examples/osmium_road_length.cpp包含一个示例。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55722997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档