Как правильно отобразить объекты с помощью GeoTools на изображение с помощью AffineTransformation? - PullRequest
1 голос
/ 06 февраля 2012

Я пытаюсь правильно отобразить некоторые функции, которые я прочитал из таблицы возможностей базы данных PostGIS с GeoTools, в изображение.

Моя конфигурация:

  • PostgreSQL 8.4
  • PostGIS 1.5
  • Осмос 0,40,1
  • ОСМембранная сборка 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 -объекту, в качестве параметра метода paint -метода рендерера?

, например

//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 Ответ

1 голос
/ 07 февраля 2012

Наиболее вероятная проблема - это Axis-Order, прочитайте эту страницу http://docs.geotools.org/latest/userguide/library/referencing/order.html и посмотрите, решит ли это вашу проблему. Если это не проблема, вы, вероятно, захотите взглянуть на ссылку на faq - мне никогда не приходилось писать свое собственное аффинное преобразование для рендеринга функций, поэтому я ожидаю, что проблема будет решена там. или в одном из других учебных пособий .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...