我正在尝试使用openstreetmap渗透来读取机场的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() {
}
};
要获取Way
的坐标,还需要做其他一些处理吗?
答案 0 :(得分:0)
事实证明,航路本身并不具有坐标,而是具有具有坐标的WayNode列表:
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);
}
});
}
答案 1 :(得分:0)
您可以使用以下代码段通过坐标增强 WayNode
:
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()));
}