【问题标题】:Request a map from WMS and save it to the disk as a PNG image从 WMS 请求地图并将其作为 PNG 图像保存到磁盘
【发布时间】:2019-08-09 17:49:15
【问题描述】:

我必须使用 java 和 GeoTools 编写代码来执行 WMS 请求,获取图像并将其保存到我计算机上的特定位置。我已经按照 GeoTools WMS 教程进行了代码编译,没有错误,但我不知道如何检查它是否有效或如何保存请求的图像?

这是带有所有必要参数的 GetMap 请求:http://ows.mundialis.de/services/service?request=GetMap&service=WMS&version=1.3.0&layers=OSM-Overlay-WMS&styles=default&crs=EPSG%3A4326&bbox=47.75,12.98,47.86,13.12&&width=2000&height=2000&format=image/png&transparent=true

代码如下:

public class WmsConnectorMaven {

    public static void main(String[] args) {

        URL url = null;
        try {
          url = new URL("http://ows.mundialis.de/services/service?service=wms&version=1.3.0&request=GetCapabilities");
        } catch (MalformedURLException e) {
          //will not happen
        }

        WebMapServer wms = null;
        try {
          wms = new WebMapServer(url);
          GetMapRequest request = wms.createGetMapRequest();
          request.addLayer("OSM-Overlay-WMS", "defualt");
          request.setFormat("image/png");
          request.setDimensions("800", "800"); //sets the dimensions of the image to be returned from the server
          request.setTransparent(true);
          request.setSRS("EPSG:4326");
          request.setBBox("47.75,12.98,47.86,13.12");

          GetMapResponse response = (GetMapResponse) wms.issueRequest(request);
          BufferedImage image = ImageIO.read(response.getInputStream());

         /* File outputfile = new File("saved.png");
            ImageIO.write(image, "png", outputfile); */

         // FileOutputStream img = new FileOutputStream("C:\\Users\\Edhem\\Desktop\\WMSimage.png");
        } catch (IOException e) {
          //There was an error communicating with the server
          //For example, the server is down
        } catch (ServiceException e) {
          //The server returned a ServiceException (unusual in this case)
        } 



    }
}

【问题讨论】:

    标签: java geotools


    【解决方案1】:

    您需要检查返回的responsecontentType 并根据该值做出决定。比如:

    try {
      GetMapResponse response = wms.issueRequest(getMapRequest);
      if (response.getContentType().equalsIgnoreCase(format)) {
        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;
      }
    } catch (ServiceException | IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      return null;
    } 
    

    更新

    我刚刚跑了your code with my checks,我得到了:

    <?xml version="1.0"?>
    <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="StyleNotDefined">unsupported styles: defualt</ServiceException>
    </ServiceExceptionReport>
    

    删除(拼错的)“defualt”给出(我猜是正确的):

    【讨论】:

    • 我试过你的代码,它给了我返回行的错误,他们不能在 void 方法中返回值。除此之外,我如何从 WMS 中选择一个特定的层,这似乎列出了服务器上的所有 nemed 层for ( Layer layer : WMSUtils.getNamedLayers(capabilities) ) { request.addLayer(layer); }
    • 在您的主要方法中您不需要返回,您的代码指定了图层名称和样式。
    • 省略返回行后,我得到&lt;?xml version="1.0"?&gt; &lt;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"&gt; &lt;ServiceException&gt;missing parameters ['layers', 'styles', 'crs']&lt;/ServiceException&gt; &lt;/ServiceExceptionReport&gt;
    • 您的错误报告帮助我使它工作。我基本上添加了Layer[] layers = WMSUtils.getNamedLayers(capabilities); request.addLayer(layers[1]); 以解决缺少的“层”和“样式”参数,以及request.setSRS("EPSG:4326"); 以解决缺少的“crs”参数。有了它,它就可以与try { GetMapResponse response = (GetMapResponse) wms.issueRequest(request); BufferedImage image = ImageIO.read(response.getInputStream()); ImageIO.write(image, "png", new File("C:\\Users\\Edhem\\Desktop\\salzburg.png")); 一起使用......谢谢伊恩!
    猜你喜欢
    • 1970-01-01
    • 2014-11-05
    • 2021-07-01
    • 2012-01-12
    • 2012-01-12
    • 1970-01-01
    • 2021-10-13
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多