【问题标题】:How to correctly render features with GeoTools to an image using AffineTransformation?如何使用 AffineTransformation 正确地将 GeoTools 的特征渲染到图像?
【发布时间】:2012-02-06 18:07:05
【问题描述】:

我正在尝试将我使用 GeoTools 从启用 PostGIS 的数据库的功能表中读取的一些功能正确渲染到图像。

我的配置:

  • PostgreSQL 8.4
  • PostGIS 1.5
  • 渗透 0.40.1
  • OSMembrane 构建 845
  • GeoTools 2.7.4

到目前为止,在边界框内渲染一些特征工作正常。
问题:我得到的结果是

  1. 旋转 90°(顺时针)
  2. 在 y 轴上镜像

我要渲染的特征是基于这个CoordinateReferenceSystem

GEOGCS["WGS 84", 
  DATUM["World Geodetic System 1984", 
    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
    AUTHORITY["EPSG","6326"]], 
  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
  UNIT["degree", 0.017453292519943295], 
  AXIS["Geodetic latitude", NORTH], 
  AXIS["Geodetic longitude", EAST], 
  AUTHORITY["EPSG","4326"]]

我知道要执行仿射变换,所以我编写了以下代码:

public void render(final MapContext mapContext, final Graphics2D graphics) throws IOException 
{
    Rectangle renderingArea = new Rectangle(this.mapWidth, this.mapHeight);

    GTRenderer renderer = new StreamingRenderer();
    renderer.setContext(mapContext);

    //move the result to a visisble area
    AffineTransform translate = AffineTransform.getTranslateInstance(mapHeight, mapWidth);
    //rotate 180° anti-clockwise
    AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI);
    //exchange x and y 
    AffineTransform mirror = new AffineTransform(0, 1, 1, 0, 0, 0);

    AffineTransform transform = new AffineTransform(translate);
    transform.concatenate(rotate);
    transform.concatenate(mirror);

    graphics.transform(transform);

    renderer.paint(graphics, renderingArea, mapContext.getAreaOfInterest());
}

这样可以使功能看起来不错!另一方面,这感觉不太对劲。问题是,为什么我不能使用在graphics-object 上应用的相同转换作为渲染器的paint-method 的方法参数?

例如

//move the result to a visisble area
AffineTransform translate = AffineTransform.getTranslateInstance(mapHeight, mapWidth);
//rotate 180° anti-clockwise
AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI);
//exchange x and y 
AffineTransform mirror = new AffineTransform(0, 1, 1, 0, 0, 0);

AffineTransform transform = new AffineTransform(translate);
transform.concatenate(rotate);
transform.concatenate(mirror);

renderer.paint(graphics, renderingArea, mapContext.getAreaOfInterest(), transform);

这总是会导致屏幕空白。我认为,它呈现在可见区域之外的某个地方。我知道 geotools 网站上的教程,但我错过了一些将所有内容放在一起的地方。

我期待任何有用的提示。

【问题讨论】:

    标签: postgis affinetransform geotools


    【解决方案1】:

    最可能的问题是 Axis-Order,请阅读此页面 http://docs.geotools.org/latest/userguide/library/referencing/order.html 并查看是否可以解决您的问题。如果这不是问题,那么您可能需要查看referencing faq - 我从来不需要编写自己的仿射变换来渲染功能,所以我希望问题能够在那里或其中一个得到回答other tutorials.

    【讨论】:

    • 添加System.setProperty("org.geotools.referencing.forceXY", "true"); 是解决方案。恕我直言,此信息应添加到GeoTools Quickstart tutorials。非常感谢!
    • 好吧,在世界开始真正正确地存储它的数据之前,这更像是一种破解。
    猜你喜欢
    • 2018-12-25
    • 2021-08-24
    • 2015-08-23
    • 2019-01-25
    • 2012-11-28
    • 1970-01-01
    • 2020-04-06
    • 2014-11-07
    • 2013-04-04
    相关资源
    最近更新 更多