Ошибка GeoTools WebMapServer GetMapRequest

Я использую GeoTools 12.2 для разработки проекта библиотеки классов Java.

Во-первых, я работаю над модулем GeoTools WMS с этим руководством. . Дело в том, что мне не удалось выполнить запрос на получение карты, чтобы я мог получить документ о возможностях, слои и т. Д.

Мой URL-адрес wms http://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer

Он содержит 3 слоя (Штаты, Реки, Города).

Я использую структуру для работы с картой, как показано ниже.

GetMapRequest getMapRequest = wms.createGetMapRequest();//wms is my WebMapServer object

getMapRequest.addLayer(tempLayer);//tempLayer contains states layer

GetMapResponse response = (GetMapResponse) wms.issueRequest(getMapRequest);

BufferedImage image = ImageIO.read(response.getInputStream());

Я также пробовал другие методы в руководстве, чтобы сделать GetMapRequest, но я не могу добиться успеха, всегда получая NullPointerException для объекта BufferedImage.

Каковы ваши предложения? Заранее спасибо.


person Haktan Aydın    schedule 26.02.2015    source источник


Ответы (1)


Вам нужно установить еще несколько параметров для вашего запроса, WMS getMapResponse не предоставляет никаких значений по умолчанию для некоторых из них (поскольку они уникальны для вашего запроса/карты). Итак, вам нужно как минимум следующее:

private BufferedImage getLayer(Layer l) {
    GetMapRequest getMapRequest = wms.createGetMapRequest();
    getMapRequest.addLayer(l);
    getMapRequest.setBBox(l.getEnvelope(DefaultGeographicCRS.WGS84));
    getMapRequest.setDimensions(200, 400);
    getMapRequest.setFormat("image/png");
    getMapRequest.setSRS("CRS:84");
    System.out.println(getMapRequest.getFinalURL());
    try {
        GetMapResponse response = wms.issueRequest(getMapRequest);
        BufferedImage image = ImageIO.read(response.getInputStream());
        return image;
    } catch (ServiceException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }

}

В общем, чтобы избежать получения пустого изображения, вы можете выполнить некоторую проверку ошибок в ответе:

     if (response.getContentType().equalsIgnoreCase("image/png")) {
            BufferedImage image = ImageIO.read(response.getInputStream());
            return image;
        } else {
            StringWriter writer = new StringWriter();
            IOUtils.copy(response.getInputStream(), writer);
            String error = writer.toString();
            System.out.println(error);
            return null;
        }

который даст вам ошибку в кодировке XML, чтобы сообщить вам, что пошло не так:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<ServiceExceptionReport version="1.3.0"
  xmlns="http://www.opengis.net/ogc"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/wms/1.3.0/exceptions_1_3_0.xsd">
  <ServiceException code="InvalidFormat">
Parameter 'bbox' can not be empty.
  </ServiceException>
</ServiceExceptionReport>
person Ian Turton    schedule 27.02.2015
comment
Спасибо @iant за ответ. Я понял, это основано на настройке размеров. Есть ли способ получить размеры по умолчанию (ширина, высота). Когда я пытаюсь использовать функции GeoTools getdimensions и т. д., значение измерения отсутствует. На самом деле я хочу установить все параметры GetMap программно. - person Haktan Aydın; 27.02.2015
comment
Размеры определяют размер изображения, поэтому зависят от того, что вы делаете с изображением. Единственное, на что следует обратить внимание, это то, что соотношение сторон должно совпадать с соотношением сторон ограничивающей рамки, иначе ваша карта будет искажена. - person Ian Turton; 27.02.2015
comment
Я хочу добавить изображение на карту openlayers на веб-странице. Как я могу динамически вычислять значения ширины и высоты? Если я не смогу правильно установить размеры, изображение не будет перекрываться картой. - person Haktan Aydın; 27.02.2015
comment
вы думаете об ограничительной рамке, в которой находится карта, размеры - насколько велико изображение. Но OL будет общаться напрямую с WMS, вам вообще не нужны GeoTools - person Ian Turton; 27.02.2015