0

我正在尝试使用 openstreetmap osmosis 来读取机场的 pbf 文件并提取大门和跑道等特征。

我使用的代码类似于:http ://www.javaoptimum.com/how-to-read-osm-pbf-files-programmatically-java/

当代码遇到Node实例时,它会从 getLatitude 和 getLongitude 返回合理的值...

但是,当代码遇到Way实例时,坐标似乎为零。这是我正在使用的代码:

    Sink sinkImplementation = new Sink() {

        public void process(EntityContainer entityContainer) {

            Entity entity = entityContainer.getEntity();
            entity.getTags().forEach((tag) -> {
                if ("aeroway".equals(tag.getKey())) {
                    if (entity instanceof Node) {
                        if ("holding_position".equals(tag.getValue())) {
                            installPointHook(airportIcaoCode, entity, tag);
                        } else if ("gate".equals(tag.getValue())) {
                            installPointHook(airportIcaoCode, entity, tag);
                        } else {
                            LOGGER.info("Ignoring unrecognized tag value " + tag.getValue());
                        }
                    } else if (entity instanceof Way) {
                        Way way = (Way)entity;
                        if ("runway".equals(tag.getValue())) {
                            way.getWayNodes().forEach((it) -> System.out.println(it + " : " + it.getLatitude()+","+it.getLongitude()));
                        } else if ("taxiway".equals(tag.getValue())) {
                            way.getWayNodes().forEach((it) -> System.out.println(it + " : " + it.getLatitude()+","+it.getLongitude()));
                        } else if ("apron".equals(tag.getValue())) {
                            way.getWayNodes().forEach((it) -> System.out.println(it + " : " + it.getLatitude()+","+it.getLongitude()));
                        } else if ("hangar".equals(tag.getValue())) {
                            way.getWayNodes().forEach((it) -> System.out.println(it + " : " + it.getLatitude()+","+it.getLongitude()));
                        } else {
                            LOGGER.info("Ignoring unrecognized tag value " + tag.getValue());
                        }
                    } else if (entity instanceof Relation) {
                        LOGGER.info("Ignoring unrecognized tag value " + tag.getValue());
                    }
                }
            });
        }

        public void initialize(Map<String, Object> arg0) {
        }

        public void complete() {
        }

        @Override
        public void close() {
        }

    };

为了获得Ways 的坐标,我还需要做一些其他的处理吗?

4

2 回答 2

0

事实证明,方式本身没有坐标,而是具有具有坐标的 WayNodes 列表:

        public void process(EntityContainer entityContainer) {

            Entity entity = entityContainer.getEntity();
            entity.getTags().forEach((tag) -> {
                if (tag.getKey().equals("aeroway") && tag.getValue().equals("runway")
                        && entity instanceof Way) {
                    final List<WayNode> wayNodes = ((Way) entity).getWayNodes();
                    Runway runway = new Runway(entity.getId(), nodes.get(wayNodes.get(0).getNodeId()),
                            nodes.get(wayNodes.get(wayNodes.size() - 1).getNodeId()));
                    runways.add(runway);
                }
            });
        }
于 2020-04-30T19:21:20.983 回答
0

WayNode您可以使用以下代码段增强s 与坐标:

private static class MySink implements Sink {
    public void process(EntityContainer entityContainer) {
        if (entityContainer.getEntity() instanceof Node) {
            Node node = (Node) entityContainer.getEntity();
            nodes.put(node.getId(), node);
        }
        
        ...
    }
    
    ...
}


for (int i = 0; i < way.getWayNodes().size(); i++) {
    WayNode wayNode = way.getWayNodes().get(i);
    Node node = sink.nodes.get(wayNode.getNodeId());
    way.getWayNodes().set(i, new WayNode(wayNode.getNodeId(), node.getLatitude(), node.getLongitude()));
}
于 2021-03-26T21:28:13.560 回答