如何使用AffineTransformation将GeoTools的特征正确渲染为图像?

时间:2012-02-06 18:07:06

标签: postgis affinetransform geotools

我正在尝试正确渲染我从带有GeoTools的支持PostGIS的数据库的功能表中读取的一些功能到图像。

我的配置:

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

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

  1. 旋转90°(顺时针)
  2. 在y轴上镜像
  3. 我要渲染的功能基于此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 - 对象上应用的相同转换作为渲染器的paint - 方法的方法参数?

    e.g。

    //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网站上的教程,但我想念一些放在一起的地方。

    我期待着任何有用的提示。

1 个答案:

答案 0 :(得分:1)

最可能的问题是Axis-Order,请阅读此页面http://docs.geotools.org/latest/userguide/library/referencing/order.html,看看是否能解决您的问题。如果那不是问题,那么你可能想看看referencing faq - 我从来没有写过我自己的仿射变换来渲染特征所以我希望问题可以在那里或在一个other tutorials