我有一个街道网络,每条街道可以分成两条街道,所以同样两条街道可以汇合成一条街道。 每次发生收敛或发散时,都存在节点。然后有工作区跨度放在街道上 (因此工作区跨度可以悬停在多条街道上)。现在的想法是我必须基本扫描并找到工作区的开始位置, 并在可通行路径上放置(至少)5个警告标志,通向工作区实际开始的地方。每个警告标志必须相隔500英尺, 所以总的来说,如果你正在接近一个工作区,你应该看到第一个警告标志,因为你距离它有2500英尺,然后是2000年的另一个, 另一个在1500等...
总的来说,所有这些实体都作为对象存在:
工作区跨度他们有一个开始和结束属性,在那里他们标记他们开始和结束的确切镜头 (示例:工作区跨度从街道1中的素材500开始,到街道9处以素材3600结束。
节点对象,节点具有连接对象,连接对象将两条街道连接在一起
总的来说,我的方法是穿越街道,并检查我从工作区开始/结束的距离。 所以我首先检查我所在的街道,如果没有工作区开始/结束,那么我检查连接, 找出是否有工作区开始/结束。如果连接街道上存在工作区开始/结束, 然后我确定它有多远。如果连接街道长2000英尺,工作区从1000开始, 这意味着我需要在我正在检查的街道上放置三个警告标志。 但正如你所看到的那样,不同的可能性会变得非常复杂。 鉴于我一次只能处理一条街道这是我提出的部分解决方案,但它仍然不完整,因为我不确定如何确定所需的最大警告标志数量。下面的场景说明了这一点,但基本上我将如何处理我在两条街道上连接到第三条街道的工作区连接的情况。如何返回所需的最高标志数量? 情况下:
//调用此方法从左侧扫描街道网络以查看是否有任何工作区 //最初我们将偏移量传递给零,以及给定的街道
public static Double getLimitIncreasing(StreetVO street, Double offset) {
List<ConnectionVO> connections = street.getBeginNode().getConnections();
for ( ConnectionVO connect : connections ) {
StreetVO connectingStreet = connect.getOtherStreet(street);
if ( connectingStreet.getSpans().containsKey(Constants.WORK_ZONE) ) {
List<Double> connectionOffsets = getConnectionPoints(connectingStreet); // gets the points in footage where a workzone begins or ends on a given street, there could be multiple ones, and they are sorted in ascending
Double streetLength = connectingStreet.getStreetLength();
Double temp = 0.0;
if ( connectionOffsets.isEmpty() && (streetLength + offset) < 2500 ) { // if we don't find any connections but the street is too small we have to look at the connecting
// streets
temp = getLimitIncreasing(connectingStreet, (streetLength + offset), subdivision, logger, ptcDataModel); // look at the next connections
if ( temp < offset ) {
offset = temp;
}
} else if ( connectionOffsets.isEmpty() && (streetLength + offset) > 2500 ) {
continue;
} else if ( connectionOffsets.size() >= 1 ) {
offset = offset + (streetLength - connectionOffsets.get(connectionOffsets.size() - 1)); // gets the last connection, and subtract it from the length to get how far from the end of the street are we
}
}
}
if ( offset != 0 ) {
return offset;
} else {
return -1.0;
}
}
public class StreetVO{
NodeVO beginNode
NodeVO endNode
Double streetLength;
Map<String,Span> spans // There are other kinds of spans , that exist , workzones-dangerzones, etc... for this part of the problem i am only concerned about workzones, so passing the key value of workzone, will return to me a span object that lets me know whether a work zone on this current street exists , and whether it begins/ends on a different street along with the exact offset it begins/ends at.
}
public class NodeVO(){ //
List<ConnectionVO> connections;
}
public class Span(){ // a workzone can exist on two different street or the same street, and it should have a begin offset , and an end offset
Double beginOffset;
StreetVO workZoneBeginStreet;
StreetVO workZoneEndStreet;
Double endOffset;
}
public class ConnectionVO(){ // this object tells you which two streets connect to each other
StreetVO beginStreet;
StreetVO endStreet;
public getOtherStreet(StreetVO street){ // given one street it will return the other one it's connected to
if(street == beginStreet)return endStreet else return beginStreet
}
}
上面附有一个示例场景,有助于可视化问题和所需的解决方案。但正如你所看到的那样,弄清楚导航路径会变得非常乏味。递归是最好的方法吗?