我是新的使用地理信息系统方面的Repast。代理必须从多个形状文件和2个栅格文件(基于lat,long)中获取像素值,以确定它们在每一个滴答的移动过程。到目前为止,我首先创建了一个地理,然后添加了光栅覆盖的地理。
我的问题如下:
我使用org.geotools包以geotif格式读取光栅文件。
GeoTiffReader geoTiffReader = new GeoTiffReader(new File(filename));
GridCoverage2D coverage = (GridCoverage2D) geoTiffReader.read(null);
geography.addCoverage("coverage1", coverage);现在,没有错误消息,所以我假设代码正确运行(显示打印stmts)并读取光栅文件。然而,显示光栅数据将是很好的。
发布于 2019-07-17 13:32:25
作为参考,我建议关注Repast地理演示模型、地理信息系统覆盖文档(https://repast.github.io/docs/RepastReference/RepastReference.html#gis-raster)和GeoTools GridCoverage API (http://docs.geotools.org/latest/userguide/library/coverage/grid.html)。就餐地理投影和显示与GeoTools GridCoverage2D实现完全兼容。您可以使用GeoTools读取器创建您在示例中描述的覆盖范围,也可以使用RepastCoverageFactory创建WritableGridCoverage2D,这只是Repast中GridCoverage2D的自定义实现,允许代理写入内存中的覆盖率。
如果您的代理只需要从覆盖率读取,那么您可以使用GeoTools读取器加载光栅文件,并通过geography.addCoverage("MyCoverage",coverage)将其分配给地理位置,您可以添加任意数量的内容。您还可以从shapefiles添加任意多个代理层到地理位置。在Repast地理演示中也演示了这一点。
一个警告是,覆盖层的栅格数据和代理的形状文件应该使用相同的CRS和投影。Repast地理假定地理信息系统中的所有数据都在同一个投影中。此外,GIS3D显示要求数据在WGS84中。GeoTools提供即时转换的实用程序,但如果需要,我建议在外部ArcGIS或QGIS工具中重新投影。
要引用加载的覆盖率,代理可以调用geography.getCoverage(coverageName),您可以使用geography.removeCoverage(coverageName)删除覆盖率。一旦代理有了覆盖率实例,它就可以直接从它读取值
double[] value = null;
DirectPosition pos = new DirectPosition2D(loc.x, loc.y);
coverage.evaluate(pos,value);值的类型将取决于光栅文件中的数据,例如浮点数、int值、字节值等。值数组将包含对应于位置的每个波段的所有值,因此您需要知道光栅文件是如何索引的--通常可以从下载文件的位置获得规范。对于NDVI光栅文件,索引可能是双倍或浮动,并且可能是数组中的唯一值。
您当然可以添加和删除覆盖层的不同滴答,以模拟随着时间的变化。只需确保代理行为的排序考虑到了这一点,例如,覆盖范围应该在滴答开始时更新,这样代理就会使用每个滴答的新数据。您可以创建一个负责更新的层管理器代理。删除和添加基于滴答的图层应该没有任何问题,虽然我还没有用显示器测试过这一点,所以我不确定这会影响到视觉效果。
要显示覆盖层,您需要使用GIS3D显示,然后只需在Repast运行时使用显示向导添加覆盖层。您可以在一个显示中包含多个覆盖层。覆盖层需要CoverageStyle来确定光栅中的数据如何转换成图像。有些光栅文件是在自包含的特定颜色地图上索引的,您可以首先尝试使用DefaultCoverageStyle,这是显示向导中的默认选项。或者,您可以提供CoverageStyle类并使用它指定光栅数据如何确定显示颜色。CoverageStyle返回一个GeoTools RasterSymbolizer实例,并在BlueCoverageStyle类的地理演示中提供一个示例。
https://stackoverflow.com/questions/57028598
复制相似问题