@Override public int addEdge(TLongList osmIds, int flags) { PointList pointList = new PointList(osmIds.size()); int successfullyAdded = 0; int firstNode = -1; int lastIndex = osmIds.size() - 1; int lastInBoundsPillarNode = -1; for (int i = 0; i < osmIds.size(); i++) { long osmId = osmIds.get(i); int tmpNode = osmIdToIndexMap.get(osmId); if (tmpNode == EMPTY) continue; // skip osmIds with no associated pillar or tower id (e.g. !OSMReader.isBounds) if (tmpNode == TOWER_NODE) continue; if (tmpNode == PILLAR_NODE) { // In some cases no node information is saved for the specified osmId. // ie. a way references a <node> which does not exist in the current file. // => if the node before was a pillar node then convert into to tower node (as it is also // end-standing). if (!pointList.isEmpty() && lastInBoundsPillarNode > -TOWER_NODE) { // transform the pillar node to a tower node tmpNode = lastInBoundsPillarNode; tmpNode = handlePillarNode(tmpNode, osmId, null, true); tmpNode = -tmpNode - 3; if (pointList.size() > 1 && firstNode >= 0) { // TOWER node successfullyAdded += addEdge(firstNode, tmpNode, pointList, flags); pointList.clear(); pointList.add(g.getLatitude(tmpNode), g.getLongitude(tmpNode)); } firstNode = tmpNode; lastInBoundsPillarNode = -1; } continue; } if (tmpNode <= -TOWER_NODE && tmpNode >= TOWER_NODE) throw new AssertionError("Mapped index not in correct bounds " + tmpNode + ", " + osmId); if (tmpNode > -TOWER_NODE) { boolean convertToTowerNode = i == 0 || i == lastIndex; if (!convertToTowerNode) lastInBoundsPillarNode = tmpNode; // PILLAR node, but convert to towerNode if end-standing tmpNode = handlePillarNode(tmpNode, osmId, pointList, convertToTowerNode); } if (tmpNode < TOWER_NODE) { // TOWER node tmpNode = -tmpNode - 3; pointList.add(g.getLatitude(tmpNode), g.getLongitude(tmpNode)); if (firstNode >= 0) { successfullyAdded += addEdge(firstNode, tmpNode, pointList, flags); pointList.clear(); pointList.add(g.getLatitude(tmpNode), g.getLongitude(tmpNode)); } firstNode = tmpNode; } } return successfullyAdded; }
@Override public int addEdge(TLongList nodes, int flags) { PointList pointList = new PointList(nodes.size()); int successfullyAdded = 0; int firstNode = -1; int lastIndex = nodes.size() - 1; int lastInBoundsPillarNode = -1; for (int i = 0; i < nodes.size(); i++) { long osmId = nodes.get(i); int tmpNode = osmIdToIndexMap.get(osmId); if (tmpNode == EMPTY) continue; // skip osmIds with no associated pillar or tower id (e.g. !OSMReader.isBounds) if (tmpNode == TOWER_NODE) continue; if (tmpNode == PILLAR_NODE) { // no pillarLats,pillarLons was saved for tmpNode // so if there are any existing pillar nodes we need to create an edge out of them if (!pointList.isEmpty() && lastInBoundsPillarNode >= 3) { // transform the pillar node to a tower node tmpNode = lastInBoundsPillarNode; tmpNode = handlePillarNode(tmpNode, osmId, null, true); tmpNode = -tmpNode - 3; if (pointList.size() > 1 && firstNode >= 0) { // TOWER node successfullyAdded += addEdge(firstNode, tmpNode, pointList, flags); pointList.clear(); pointList.add(g.getLatitude(tmpNode), g.getLongitude(tmpNode)); } firstNode = tmpNode; lastInBoundsPillarNode = -1; } continue; } if (tmpNode <= -TOWER_NODE && tmpNode >= TOWER_NODE) throw new AssertionError("Mapped index not in correct bounds " + tmpNode); if (tmpNode > -TOWER_NODE) { lastInBoundsPillarNode = tmpNode; // PILLAR node, but convert to towerNode if end-standing tmpNode = handlePillarNode(tmpNode, osmId, pointList, i == 0 || i == lastIndex); } if (tmpNode < TOWER_NODE) { // TOWER node tmpNode = -tmpNode - 3; pointList.add(g.getLatitude(tmpNode), g.getLongitude(tmpNode)); if (firstNode >= 0) { successfullyAdded += addEdge(firstNode, tmpNode, pointList, flags); pointList.clear(); pointList.add(g.getLatitude(tmpNode), g.getLongitude(tmpNode)); } firstNode = tmpNode; } } return successfullyAdded; }