@SuppressWarnings("unchecked")
@Transactional(readOnly = true, rollbackFor = Throwable.class)
public MultiLineString calculateRoute(final Point origen,
final Point destino, final funcion f) {
log.trace("calculateRoute(" + origen + ", " + destino + ", " + f + ")");
MultiLineString resultado = null;
try {
Long origin = getVertex(origen, false);
Long goal = getVertex(destino, true);
List<Long> ids = new ArrayList<Long>(0);
if (origin != null && goal != null)
switch (f) {
case SIMPLE:
ids = getSimpleGid(origin, goal);
break;
case SHOOTING_STAR:
ids = shortest_path_shooting_star(origin, goal);
break;
}
if (ids.size() > 0) {
Session currentSession = getSession();
final Criteria criteria = currentSession.createCriteria(
Routing.class).add(Restrictions.in("id", ids))
.setProjection(Projections.property("geometria"));
log.trace(criteria);
List<Object> lineas = criteria.list();
List<LineString> lineStrings = new LinkedList<LineString>();
for (Object m : lineas) {
if (m instanceof MultiLineString)
for (int i = 0; i < ((MultiLineString) m)
.getNumGeometries(); i++)
lineStrings.add((LineString) ((MultiLineString) m)
.getGeometryN(i));
else if (m instanceof LineString)
lineStrings.add((LineString) m);
else
log.error("Devuelto alto extra�o: " + m);
}
resultado = new MultiLineString(lineStrings
.toArray(new LineString[0]), new GeometryFactory());
resultado.setSRID(4326);
if (log.isTraceEnabled())
log.trace("Resultado: " + resultado);
}
} catch (Throwable t) {