⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spatialmodel.java

📁 linux下用于移动节点的移动活动生成工具
💻 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 + -