对于参考,我建议盯着 Repast Geography 演示模型、关于覆盖率的 GIS 文档 ( https://repast.github.io/docs/RepastReference/RepastReference.html#gis-raster ) 和 GeoTools GridCoverage API ( http: //docs.geotools.org/latest/userguide/library/coverage/grid.html)。Repast Geography 投影和显示与 GeoTools GridCoverage2D 实现完全兼容。您可以使用 GeoTools 阅读器来创建您在示例中描述的覆盖,或者您可以使用 RepastCoverageFactory 创建 WritableGridCoverage2D,它们只是 Repast 中 GridCoverage2D 的自定义实现,允许代理写入内存中的覆盖。
如果您的代理只需要从 coverage 中读取,那么您可以使用 GeoTools 读取器加载栅格文件并通过 geography.addCoverage("MyCoverage", coverage) 分配给地理,您可以添加任意数量的内容。您还可以根据需要从 shapefile 向地理添加任意数量的代理层。这也在 Repast Geography 演示中得到了展示。
需要注意的是,coverage 的栅格数据和代理的 shapefile 应使用相同的 CRS 和投影。Repast Geography 假设 geograpy 中的所有 GIS 数据都在同一个投影中。此外,GIS3D 显示需要 WGS84 格式的数据。GeoTools 提供了用于即时转换的实用程序,但如果需要,我建议在 ArcGIS 或 QGIS 等外部 GIS 工具中重新投影。
要引用加载的覆盖,代理可以调用 geography.getCoverage(coverageName),您可以使用 geography.removeCoverage(coverageName) 删除覆盖。一旦代理拥有了覆盖实例,它就可以通过以下方式直接从中读取值
double[] value = null;
DirectPosition pos = new DirectPosition2D(loc.x, loc.y);
coverage.evaluate(pos,value);
值的类型取决于栅格文件中的数据,例如浮点数、整数、字节等。值数组将包含与位置对应的每个波段的所有值,因此您需要知道栅格如何文件已编入索引 - 通常规格可从您下载文件的位置获得。对于 NDVI 栅格文件,索引可能是双精度或浮点数,并且可能是数组中的唯一值。
您当然可以在不同的滴答声中添加和删除覆盖层,以模拟随时间的变化。只需确保代理行为的排序考虑到这一点,例如覆盖率应在滴答开始时更新,以便代理在每个滴答时使用新数据。您可以创建一个负责更新的图层管理器代理。根据刻度删除和添加图层应该没有任何问题,虽然我没有用显示器测试过这个,所以我不确定这会在视觉上产生影响。
要显示覆盖层,您需要使用 GIS3D 显示,然后只需在 Repast 运行时中使用显示向导添加覆盖层。您可以在单个显示中包含多个覆盖层。Coverage 图层需要 CoverageStyle 来确定栅格中的数据如何转换为图像。一些光栅文件在自包含的特定颜色图上建立索引,您可以首先尝试使用 DefaultCoverageStyle,这是显示向导中的默认选项。或者,您可以提供 CoverageStyle 类并使用它来指定栅格数据如何确定显示颜色。CoverageStyle 返回一个 GeoTools RasterSymbolizer 实例,在 BlueCoverageStyle 类的 Geography 演示中提供了一个示例。