2017-08-23 3 views
1

Javaを使用する人気のあるRepastゾンビチュートリアルでは、NetworkBuilderを使用して、感染ネットワークを視覚化することができます。私は地理学/ GISの文脈で使用できるものがあれば疑問に思っていました。あるいは、自分のものをどう構築することができるかについての考えはありますか?たとえば、エージェントがA点からB点に移動する場合、2つを結ぶベクトルを描く関数を書くことはできますか?Repast NetworkBuilderを地理およびGISディスプレイで使用できますか?

答えて

2

GISディスプレイで視覚化できる地理投影のRepastネットワークオブジェクトを管理する投影リスナークラスを作成しました。付属のリスナークラスは、プロジェクトに入れて、このような地理やネットワーク投影リンクするContextBuilderで使用することができます

GeographyParameters geoParams = new GeographyParameters(); 
Geography geography = GeographyFactoryFinder.createGeographyFactory(null).createGeography("Geography", context, geoParams); 

NetworkBuilder<Object> netBuilder = new NetworkBuilder<Object>("Network", context, true); 
Network net = netBuilder.buildNetwork(); 

GISNetworkListener netListener = new GISNetworkListener(context, geography, net); 

GIS NetworkListenerは、1人の意志の変化、その指定されたコンテキスト内の地理やネットワークを結合しをもう一方に反映される。これは、ネットワークの追加/削除エッジイベントとともに、エージェントの移動、追加、地理的な場所からの削除を処理します。複数のネットワークがある場合は、それぞれに個別のリスナーインスタンスを作成できます。 Repastネットワークおよび地形投影がコード内で正常に使用されている限り、投影間のイベントを更新するための追加コードは必要ありません。

GISディスプレイでネットワークエッジを視覚化するには、添付されたMyNetworkEdgeクラスなど、RepastEdgeを拡張する単純なエッジクラスを作成する必要があります。これは、表示ウィザードがスタイリング用のユーザークラスを必要とするためです。この表示では、エージェントタイプダイアログでMyNetworkEdgeクラスを選択し、添付されているMyNetworkStyleクラスのようなラインタイプまたはスタイルクラスのいずれかを指定できます。 Repastネットワークでリンクを作成するには、MyNetworkEdgeで追加と削除の方法を使用する必要があります。

net.addEdge(new MyNetworkEdge(source, target)); 

もちろん、必要に応じて、さらに多くの機能をMyNetworkEdgeクラスに追加できます。

ProjectionListenerクラス:

package geography; 

import com.vividsolutions.jts.geom.Coordinate; 
import com.vividsolutions.jts.geom.GeometryFactory; 
import com.vividsolutions.jts.geom.LineString; 
import com.vividsolutions.jts.geom.MultiLineString; 

import repast.simphony.context.Context; 
import repast.simphony.space.gis.Geography; 
import repast.simphony.space.graph.Network; 
import repast.simphony.space.graph.RepastEdge; 
import repast.simphony.space.projection.ProjectionEvent; 
import repast.simphony.space.projection.ProjectionListener; 

/** 
* A ProjectionListener implementation for managing Repast network edges in a 
* Repast geography projection. This listener responds to both geography event 
* and network events. 
* 
* @author Eric Tatara 
* 
*/ 
public class GISNetworkListener implements ProjectionListener { 

    Context context; 
    Network network; 
    Geography geography; 
    GeometryFactory fac = new GeometryFactory(); 

    public GISNetworkListener(Context c, Geography g, Network n) { 
     context = c; 
     network = n; 
     geography = g; 

     network.addProjectionListener(this); 
     geography.addProjectionListener(this); 
    } 

    @Override 
    public void projectionEventOccurred(ProjectionEvent evt) { 

     // When an object is moved in the geography, its network edges positions 
     // should be updated if the object has edges. 
     if (evt.getType() == ProjectionEvent.OBJECT_MOVED){ 
      Iterable<RepastEdge> edges = network.getEdges(evt.getSubject()); 

      if (edges != null){ 
       for (RepastEdge e : edges){ 
        // Get the existing geometry for this edge 
        MultiLineString lineFeature = (MultiLineString)geography.getGeometry(e); 

        Coordinate sourceCoord = geography.getGeometry(e.getSource()).getCoordinate(); 
        Coordinate targetCoord = geography.getGeometry(e.getTarget()).getCoordinate(); 

        Coordinate coords[] = lineFeature.getCoordinates(); 

        // Update the edge coordinates based on the source and target object 
        // (agent) coordinates. 
        coords[0].setCoordinate(sourceCoord); 
        coords[1].setCoordinate(targetCoord); 
       } 
      } 
     } 

     // When a Repast network edge is added, create a new MultiLineString geometry 
     // to represent the edge in the geography. 
     else if (evt.getType() == ProjectionEvent.EDGE_ADDED){ 
      RepastEdge e = (RepastEdge)evt.getSubject(); 

      Coordinate sourceCoord = geography.getGeometry(e.getSource()).getCoordinate(); 
      Coordinate targetCoord = geography.getGeometry(e.getTarget()).getCoordinate(); 

      LineString lineString = fac.createLineString(new Coordinate[]{sourceCoord, 
        targetCoord}); 

      MultiLineString mls = fac.createMultiLineString(new LineString[]{lineString}); 

      context.add(e); 
      geography.move(e, mls); 
     } 

     // When a Repast edge remove event occurs, remove the edge geometry from the 
     // geography and the context. This should also occur automatically when agents 
     // are removed from a context or network. 
     else if (evt.getType() == ProjectionEvent.EDGE_REMOVED){ 
      RepastEdge e = (RepastEdge)evt.getSubject(); 

      geography.move(e, null); 
      context.remove(e);   
     } 
    } 
} 

RepastEdgeクラス:

package geography; 

import repast.simphony.space.graph.RepastEdge; 

public class MyNetworkEdge extends RepastEdge { 

    public MyNetworkEdge(Object source, Object target){ 
     super(source, target, false); 
    } 

} 

ネットワークスタイルクラス:

package geography; 

import gov.nasa.worldwind.render.SurfacePolyline; 
import gov.nasa.worldwind.render.SurfaceShape; 

import java.awt.Color; 

import repast.simphony.visualization.gis3D.style.SurfaceShapeStyle; 

/** 
* Style for MyNetworkEdges. 
* 
* @author Eric Tatara 
* 
*/ 
public class MyNetworkStyle implements SurfaceShapeStyle<MyNetworkEdge>{ 

    @Override 
    public SurfaceShape getSurfaceShape(MyNetworkEdge object, SurfaceShape shape) { 
     return new SurfacePolyline(); 
    } 

    @Override 
    public Color getFillColor(MyNetworkEdge obj) { 
     return null; 
    } 

    @Override 
    public double getFillOpacity(MyNetworkEdge obj) { 
     return 0; 
    } 

    @Override 
    public Color getLineColor(MyNetworkEdge obj) { 
     return Color.BLUE; 
    } 

    @Override 
    public double getLineOpacity(MyNetworkEdge obj) { 
     return 1.0; 
    } 

    @Override 
    public double getLineWidth(MyNetworkEdge obj) { 
     return 2; 
    } 
} 
関連する問題