У меня есть сеть улиц, каждая улица может расходиться на две улицы, поэтому две улицы могут сходиться в одну улицу.
Каждый раз, когда происходит схождение или расхождение, существует узел. И затем есть промежутки рабочей зоны, которые помещаются сверху улиц
(таким образом, диапазон рабочей зоны может зависать над несколькими улицами). Теперь идея состоит в том, что я должен в основном сканировать и найти, где начинаются рабочие зоны,
и разместите (как минимум) 5 предупреждающих знаков на проходимом пути, ведущем к месту, где фактически начинается рабочая зона. каждый предупреждающий знак должен быть разделен на 500 футов,
так что в целом, если вы приближаетесь к рабочей зоне, вы должны увидеть первый предупреждающий знак на расстоянии 2500 футов от него, а затем еще один в 2000 году,
и еще один в 1500 и т.д ...
Таким образом, в целом все эти сущности существуют как объекты:
- Уличный объект Начинается и заканчивается в узлах, еще одно свойство улиц - это то, как долго они 5000.
Области рабочей зоны. Они имеют свойство начала и конца, где отмечают точные кадры, с которых они начинаются и заканчиваются.
(Пример: интервал рабочей зоны начинается на кадре 500 на улице 1 и заканчивается на улице 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
}
}
Пример сценария изображения
Прикрепленный выше пример сценария, который поможет визуализировать проблему и желаемое решение. Но, как вы можете видеть, это может быть довольно утомительно при определении путей навигации. Является ли рекурсия лучшим подходом?