2012-02-06 4 views
1

GeoTools가 포함 된 PostGIS 사용 데이터베이스의 기능 테이블에서 이미지로 읽은 일부 기능을 올바르게 렌더링하려고합니다.AffineTransformation을 사용하여 이미지에 GeoTools의 기능을 올바르게 렌더링하는 방법은 무엇입니까?

내 구성 :

  • PostgreSQL의 8.4
  • PostGIS와 1.5
  • 투 0.40.1
  • OSMembrane 845
  • GeoTools 일부를 렌더링 2.7.4

를 구축 기능 나는 바운딩 박스 옆면은 지금까지 잘 작동합니다.
문제 : 나는

  1. 회전하는 결과를 얻을 수 (시계 방향)
  2. 가 y 축

내가 렌더링하려는 기능에 미러링이 기반으로 90 ° 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"]] 

나는 아핀 변환을 수행하고 있으므로 writt 다음 코드 조각 :

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()); 
} 

이 기능을 사용하면 기능이 좋아집니다. 반면에, 이것은 꽤 옳다고 느끼지 않습니다. 문제는 렌더러 paint-method의 메소드 매개 변수로 graphics-object에 적용한 것과 동일한 변환을 사용할 수없는 이유는 무엇입니까?

//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

가장 큰 문제는 축 순서이며이 페이지 http://docs.geotools.org/latest/userguide/library/referencing/order.html을 읽고 문제가 해결되는지 확인하십시오. 그게 문제가 아니라면 referencing faq을보고 싶을 것입니다. 저는 직접 affine transform을 작성하여 기능을 렌더링 할 필요가 없으므로 그곳에서 또는 other tutorials 중 하나에서 문제가 응답 될 것으로 기대합니다.

+0

'System.setProperty ("org.geotools.referencing.forceXY", "true");가 추가되었습니다. IMHO이 정보는 [GeoTools Quickstart tutorials] (http://docs.geotools.org/latest/userguide/tutorial/quickstart/index.html)에 추가되어야합니다. 고마워요! – pmoule

+0

세계가 실제로 데이터를 올바르게 저장하기 시작할 때까지 우리를 조종 할 수있는 해킹이 더 많습니다. –

+0

이 해킹을 완료하는 데는 지금 매우 유용합니다. :) – pmoule