流行的使用java的Repast zombie教程使用了一个NetworkBuilder,允许您可视化感染网络。我想知道是否有类似的东西可以用于地理/GIS环境。或者,有没有关于我如何构建自己的体系的想法?例如,如果我的代理从A点移动到B点,我可以编写一个函数来绘制一个连接这两个点的向量吗?
我编写了一个投影侦听器类,它将管理地理投影中的Repast网络对象,该投影可以在GIS显示中可视化。附加的侦听器类可以放置在您的项目中并在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在指定上下文中绑定地理和网络,以便一个中的更改将反映在另一个中。这处理代理移动、添加和从地理中删除以及网络添加/删除边缘事件。如果您有多个网络,您可以为每个网络创建单独的侦听器实例。只要Repast网络和地理投影在您的代码中正常使用,就不需要额外的代码来更新投影之间的事件。
要在GIS显示中可视化网络边缘,需要创建一个扩展RepasEdge的简单边缘类,例如附加的MyNetworkEdge类。这只是因为显示向导需要一个用于样式设置的用户类。在显示中,可以在“代理类型”对话框中选择MyNetworkEdge类,并指定线型或样式类,如附加的MyNetworkStyle类。要在Repast网络中创建链接,您需要在MyNetworkEdge中使用add和remove edge方法,例如:。
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;
}
}
<script> </script>
我目前正在研究城市环境下最后一英里交付领域的论文。 我想了解Anylogic软件的功能,我们正在开发一个基于agent的城市环境中最后一英里交付的模拟模型。在我们的模型中,最重要的模拟领域之一是在我们的分析中使用驾驶员从A点移动到B点所需的时间和距离。 因此,我们正在询问Anylogic是否能够为用户“我们”提供从A点移动到B点所需的时间,而不假设驱动程序的速度,类似于从软件(如Google Ma
SuperMap Online提供路径导航、正/逆地理编码、坐标转换、本地搜索等常用的分析服务。GIS云分析服务是以“GIS功能+全国基础数据“的方式提供的REST服务,是可以直接拿来就用的GIS能力。您可以直接在业务系统中,通过REST API调用这些服务,也可以将GIS云存储的数据服务和上述云分析服务结合在一起进行应用开发。 点击了解更多详细信息。
我对硒比较陌生。目前,在我的公司,我们使用Eclipse创建并运行测试自动化(Maven/Cucumber/Selenium)。我们还将IntelliJIDEA用于Java开发 我的问题是,是否可以像使用Eclipse(Maven/Ccucumber/Selenium)一样使用IntelliJ IDEA进行自动化测试?我的意思是构建测试自动化脚本。如果是,那么您可以推荐任何解释如何为Intelli
我是apache beam环境中的新手。正在尝试为批处理业务流程安装apache beam管道。 我对批次的定义如下 批次== 作业/子作业之间可能存在依赖关系。 apache波束管道可以用我的自定义批次映射吗??
导入pygame 来自pygame。本地进口* 从系统导入退出 皮加梅。init() SCREEN_size(1000,560) screen=pygame。陈列设置模式(屏幕大小,0,32) font=pygame。字体。SysFont(“阿尔及利亚”,18) 字体高度=字体。获取_lineSize() 事件文本 pygame.display.update() 而真: pygame.displa