📄 spatialmodel.java
字号:
package de.uni_stuttgart.informatik.canu.spatialmodel.core;
/**
* <p>Title: Spatial Model</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: University of Stuttgart</p>
* @author Illya Stepanov
* @version 1.1
*/
import de.uni_stuttgart.informatik.canu.mobisim.extensions.Graph;
import de.uni_stuttgart.informatik.canu.mobisim.core.*;
import de.uni_stuttgart.informatik.canu.senv.core.*;
import de.uni_stuttgart.informatik.canu.spatialmodel.geometry.*;
/**
* This class implements Spatial Model
* @author Illya Stepanov
*/
public class SpatialModel extends ExtensionModule
{
/**
* Spatial Model elements
*/
protected java.util.Map elements = new java.util.HashMap();
/**
* Graph of the movement area
*/
protected Graph graph;
/**
* Edge - spatial model element mapping
* Key: Edge, Value: parent SpatialModelElement object
*/
protected java.util.Map edgesParents;
/**
* Vertex-to-Junction mapping
* Key: Vertex, Value: corresponding junction (SpatialModelElement object)
*/
protected java.util.Map verticesToJunctions;
/**
* Vertex - edge mapping
* Key: V1_ID:V2_ID, Value: associated edge
*/
protected java.util.Map edgesCache;
/**
* Constructor
*/
public SpatialModel()
{
super("SpatialModel");
}
/**
* Returns the module's description. <br>
* <br>
* @return extension module's description
*/
public String getDescription()
{
return "Spatial Model extension";
}
/**
* Executes the extension. <br>
* <br>
* The method is called on every simulation timestep.
* @return 0 - the module should be executed on next timesteps,
* -1 - the module should not be executed on further timesteps and should be removed from the extensions' list
*/
public int act()
{
return 0;
}
/**
* Visualizes a collection of elements. <br>
* <br>
* @param g graphic context
* @param collection collection of elements
* @param color color
*/
protected static void visualizeCollection(java.awt.Graphics g, java.util.Collection collection, java.awt.Color color)
{
java.util.Iterator iter = collection.iterator();
while (iter.hasNext())
{
g.setColor(color);
SpatialModelElement element = (SpatialModelElement)iter.next();
GeometryElement geometry = element.getGeometry();
// call corresponding drawing routine
if (geometry instanceof Polygon)
visualizePolygon(g, (Polygon)geometry);
else
if (geometry instanceof Polyline)
visualizePolyline(g, (Polyline)geometry);
else
if (geometry instanceof Point)
visualizePoint(g, (Point)geometry);
}
}
/**
* Visualizes a point. <br>
* <br>
* @param g graphic context
* @param point point
*/
protected static void visualizePoint(java.awt.Graphics g, Point point)
{
g.drawLine((int)point.getX(), (int)point.getY(),
(int)point.getX(), (int)point.getY());
}
/**
* Visualizes a polyline. <br>
* <br>
* @param g graphic context
* @param polyline polyline
*/
protected static void visualizePolyline(java.awt.Graphics g, Polyline polyline)
{
int nPoints = polyline.getPoints().size();
if (nPoints==0)
return;
int[] xPoints = new int[nPoints];
int[] yPoints = new int[nPoints];
// Copy the points' coordinates
for (int i=0; i<nPoints; i++)
{
Point p = (Point)polyline.getPoints().get(i);
xPoints[i] = (int)p.getX();
yPoints[i] = (int)p.getY();
}
g.drawPolyline(xPoints, yPoints, nPoints);
}
/**
* Visualizes a polygon. <br>
* <br>
* @param g graphic context
* @param polygon polygon
*/
protected static void visualizePolygon(java.awt.Graphics g, Polygon polygon)
{
int nPoints = polygon.getPoints().size();
if (nPoints==0)
return;
int[] xPoints = new int[nPoints];
int[] yPoints = new int[nPoints];
// Copy the points' coordinates
for (int i=0; i<nPoints; i++)
{
Point p = (Point)polygon.getPoints().get(i);
xPoints[i] = (int)p.getX();
yPoints[i] = (int)p.getY();
}
g.drawPolygon(xPoints, yPoints, nPoints);
}
/**
* Draws the contents of Spatial Model in a given frame. <br>
* <br>
* @param g graphic context
*/
public void visualize(java.awt.Graphics g)
{
// save old color
java.awt.Color oldColor = g.getColor();
// possible element categories
java.util.ArrayList administrativeAreas = new java.util.ArrayList();
java.util.ArrayList namedAreas = new java.util.ArrayList();
java.util.ArrayList roads = new java.util.ArrayList();
java.util.ArrayList railways = new java.util.ArrayList();
java.util.ArrayList waterways = new java.util.ArrayList();
java.util.ArrayList buildings = new java.util.ArrayList();
java.util.ArrayList woodlands = new java.util.ArrayList();
java.util.ArrayList parks = new java.util.ArrayList();
java.util.ArrayList islands = new java.util.ArrayList();
java.util.ArrayList services = new java.util.ArrayList();
// sort the Spatial Model elements into categories
java.util.Iterator iter = elements.values().iterator();
while (iter.hasNext())
{
SpatialModelElement element = (SpatialModelElement)iter.next();
if (element.getClassCode().equals("11"))
administrativeAreas.add(element);
else
if (element.getClassCode().equals("31"))
namedAreas.add(element);
else
if (element.getClassCode().equals("41"))
roads.add(element);
else
if (element.getClassCode().equals("42"))
railways.add(element);
else
if (element.getClassCode().equals("43"))
waterways.add(element);
else
if (element.getClassCode().equals("71"))
{
if (element.getSubClassCode().equals("10"))
buildings.add(element);
else
if (element.getSubClassCode().equals("20"))
woodlands.add(element);
else
if (element.getSubClassCode().equals("70"))
parks.add(element);
else
if (element.getSubClassCode().equals("80"))
islands.add(element);
}
else
if (element.getClassCode().equals("73"))
services.add(element);
}
// display elements in given order
visualizeCollection(g, administrativeAreas, java.awt.Color.LIGHT_GRAY);
visualizeCollection(g, namedAreas, java.awt.Color.LIGHT_GRAY);
visualizeCollection(g, islands, java.awt.Color.DARK_GRAY);
visualizeCollection(g, woodlands, new java.awt.Color(128, 64, 64));
visualizeCollection(g, parks, java.awt.Color.GREEN);
visualizeCollection(g, railways, java.awt.Color.ORANGE);
visualizeCollection(g, waterways, java.awt.Color.BLUE);
visualizeCollection(g, buildings, new java.awt.Color(128, 128, 0));
visualizeCollection(g, roads, java.awt.Color.BLACK);
visualizeCollection(g, services, java.awt.Color.YELLOW);
// restore old color
g.setColor(oldColor);
}
/**
* Gets Spatial Model elements
* @return map map of Spatial Model elements
*/
public java.util.Map getElements()
{
return elements;
}
/**
* Gets a specific element from collection of Spatial Model Elements. <br>
* <br>
* @param id element ID
* @return Spatial Model Element with given ID
*/
public SpatialModelElement getElement(String id)
{
return (SpatialModelElement)elements.get(id);
}
/**
* Gets the movement area's graph. <br>
* <br>
* @return movement area's graph
*/
public Graph getGraph()
{
return graph;
}
/**
* Rebuilds the movement area's graph
*/
public void rebuildGraph() throws Exception
{
graph = new Graph(name+"_graph");
verticesToJunctions = new java.util.HashMap();
edgesParents = new java.util.HashMap();
edgesCache = new java.util.HashMap();
java.util.ArrayList elements_arr = new java.util.ArrayList(elements.values());
// build a street network graph
int v_id = 0;
Vertex v1 = null;
Edge edge = null;
for (int i=0; i<elements_arr.size(); i++)
{
SpatialModelElement element = (SpatialModelElement)elements_arr.get(i);
// check if a road element
if ( !element.getClassCode().equals("41") ||
!element.getSubClassCode().equals("10") ||
(element.getGeometry()==null) ||
(element.getGeometry() instanceof Polygon) ||
(element.getGeometry() instanceof Point) ||
(element.getChildren().size()>0) )
continue;
// process polyline
Polyline polyline = (Polyline)element.getGeometry();
if (polyline.getPoints().size()<2)
continue;
// add initial point
Point p = (Point)polyline.getPoints().get(0);
Vertex v = graph.getVertex(p.getX(), p.getY());
if (v==null)
{
v = graph.addVertex(""+v_id, "", Double.toString(p.getX()), Double.toString(p.getY()));
v_id++;
}
// add intermediate points
for (int j=1; j<polyline.getPoints().size()-1; j++)
{
p = (Point)polyline.getPoints().get(j);
v1 = graph.getVertex(p.getX(), p.getY());
if (v1==null)
{
v1 = graph.addVertex(""+v_id, "", Double.toString(p.getX()), Double.toString(p.getY()));
v_id++;
}
edge = findEdge(v, v1);
if (edge==null)
{
edge = graph.addEdge(v.getID(), v1.getID());
edgesParents.put(edge, element);
edgesCache.put(edge.getID1()+":"+edge.getID2(), edge);
}
v = v1;
}
// add last point
p = (Point)polyline.getPoints().get(polyline.getPoints().size()-1);
v1 = graph.getVertex(p.getX(), p.getY());
if (v1==null)
{
v1 = graph.addVertex(""+v_id, "", Double.toString(p.getX()), Double.toString(p.getY()));
v_id++;
}
edge = findEdge(v, v1);
if (edge==null)
{
edge = graph.addEdge(v.getID(), v1.getID());
edgesParents.put(edge, element);
edgesCache.put(edge.getID1()+":"+edge.getID2(), edge);
}
}
graph.getInfrastructureGraph().reorganize(false);
u.setDimensionX((float)graph.getRightmostCoordinate());
u.setDimensionY((float)graph.getUppermostCoordinate());
// initialize vertex-to-junction mappings
for (int i=0; i<elements_arr.size(); i++)
{
SpatialModelElement element = (SpatialModelElement)elements_arr.get(i);
// check if a junction
if ( !element.getClassCode().equals("41") ||
!element.getSubClassCode().equals("20") ||
(element.getGeometry()==null) ||
(!(element.getGeometry() instanceof Point)) ||
(element.getChildren().size()>0) )
continue;
Point p = (Point)element.getGeometry();
v1 = graph.getVertex(p.getX(), p.getY());
if (v1!=null)
{
verticesToJunctions.put(v1, element);
}
}
}
/**
* Finds an edge between two points. <br>
* <br>
* @param v1 first vertex of the edge
* @param v2 second vertex of the edge
* @return the edge between vertices
*/
public Edge findEdge(Vertex v1, Vertex v2)
{
String key1 = ""+v1.getID()+":"+v2.getID();
String key2 = ""+v2.getID()+":"+v1.getID();
Edge res = (Edge)edgesCache.get(key1);
if (res==null)
res = (Edge)edgesCache.get(key2);
return res;
}
/**
* Maps the edge to a corresponding Spatial Model element.<br>
* <br>
* @param edge edge
* @return associated Spatial Model element
*/
public SpatialModelElement mapEdgeToElement(Edge edge)
{
return (SpatialModelElement)edgesParents.get(edge);
}
/**
* Maps the vertex to a corresponding junction element.<br>
* <br>
* @param vertex vertex
* @return associated junction element
*/
public SpatialModelElement mapVertexToJunction(Vertex vertex)
{
return (SpatialModelElement)verticesToJunctions.get(vertex);
}
/**
* Determines if the movement on the edge is prohibited in the given direction. <br>
* <br>
* @param vs source vertex of the edge
* @param vd destination vertex of the edge
* @return true if the movement is prohibited
*/
public boolean isMovementProhibited(Vertex vs, Vertex vd)
{
boolean res = false;
Edge edge = findEdge(vs, vd);
SpatialModelElement parent = mapEdgeToElement(edge);
if (parent!=null)
{
String d_s = (String)parent.getAttributes().get("DF");
if (d_s!=null)
{
int d = Integer.parseInt(d_s);
if ( ((edge.getV1()==vs)&&(edge.getV2()==vd)&&((d==2)||(d==4)))
||((edge.getV1()==vd)&&(edge.getV2()==vs)&&((d==3)||(d==4))))
{
// movement is prohibited
res = true;
}
}
}
return res;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -