zoukankan      html  css  js  c++  java
  • Java中调用ArcGIS Server REST API

    前面写过一篇博文<<利用ArcGIS Server REST API实现对Feature的编辑操作>>,讲述了Flex中如何调用ArcGIS的REST服务。这里我们来看一下Java中如何调用ArcGIS Server Rest API,同样利用Esri提供的在线服务http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Fire/Sheep/FeatureServer/0作为测试用例。
     
    查询功能的实现
    在浏览器中输入http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Fire/Sheep/FeatureServer/0/query,在where中输入1=1,Out Fields输入*,点击Query(GET)或者Query(POST)即可查看所有的记录。
    参考这部分API的说明文档,我们在Java中通过调用REST API来实现与上面的操作对应的查询功能,首先需要引入httpcomponents-client-4.2.1-bin.tar.gz中lib文件夹下的所有jar包,以支持HttpClient、BasicNameValuePair等类。相关代码如下:
    public void query(){
            //创建一个http客户端
            HttpClient client=new DefaultHttpClient();
            //创建一个POST请求  
            HttpPost request=new HttpPost("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Fire/Sheep/FeatureServer/0/query");
             //设置HTTP POST请求参数必须用NameValuePair  
            List<NameValuePair> params = new ArrayList<NameValuePair>();  
            params.add(new BasicNameValuePair("f", "json"));//format设置成json
            params.add(new BasicNameValuePair("where","1=1"));
            params.add(new BasicNameValuePair("outFields","*"));
             
            try {
                //设置http Post请求参数 
                HttpEntity entity = new UrlEncodedFormEntity(params);
                request.setEntity(entity); 
                HttpResponse response=client.execute(request);
                if(response.getStatusLine().getStatusCode()==200){//如果状态码为200,就是正常返回
                    String result=EntityUtils.toString(response.getEntity());
                    System.out.println(result);            
                    //需要对返回的结果进行分析,判断新增记录是成功还是失败
                    //如果成功,则进行后续的分析
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                //进行处理操作            
            } catch (IOException e) {
                //进行处理操作
            }        
        }
     
    新增功能的实现 
    在浏览器中输入http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Fire/Sheep/FeatureServer/0/addFeatures,Format选择JSON,在Features中输入[{"geometry":{"y":34,"x":108},"attributes":{"description":"addPoint","type":2}}],点击AddFeatures即可新增记录。
    Java中实现新增功能的代码和查询功能基本相同,其难点在于构造出Features对应的JSON字符串。要在Java中实现上面的新增功能,可直接使用构造好的json字符串:
    params.add(new BasicNameValuePair("features","[{'geometry':{'y':34,'x':108},'attributes':{'description':'addPoint','type':2}}]"));
    但是考虑到灵活性,我们需要根据参数动态构造出JSON字符串:首先需引入jackson-all-1.7.6,该工具能将对象转换成json字符串,具体代码如下:
    /**根据参数构造生成json字符串
         * 示例:[{"geometry":{"y":0,"x":0},"attributes":{"description":"addPoint","type":2}}]     * 
         * */
        public String makeJson(){
            //构造空间数据
            Map<String,Object> geometry = new HashMap<String,Object>();
            geometry.put("x", "108");
            geometry.put("y", "34");
            
            //构造属性数据
            Map<String,Object> attributes = new HashMap<String,Object>();
            attributes.put("description", "addpoint");
            attributes.put("type", "2");   
            
            //构造一个feature    
            Map<String,Object> feature = new HashMap<String,Object>();
            feature.put("geometry", geometry);
            feature.put("attributes", attributes);
            
            List<Map<String,Object>> features = new ArrayList<Map<String,Object>>(); 
            features.add(feature);
            
            //利用jackson工具将对象转换成json字符串
            ObjectMapper mapper = new ObjectMapper();  
            String jsonStr = null;
            try {
                jsonStr = mapper.writeValueAsString(features);
            } catch (JsonGenerationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JsonMappingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return jsonStr;
        }
    下面给出新增函数的代码,其中params.add( new BasicNameValuePair("features" ,makeJson()));使用了前面构造生成的json字符串:
    /**新增记录
         * 示例:[{"geometry":{"y":0,"x":0},"attributes":{"description":"addPoint","type":2}}]     * 
         * *///
        public void addFeature(){
            //创建一个http客户端
            HttpClient client=new DefaultHttpClient();
            //创建一个POST请求  
            HttpPost request=new HttpPost("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Fire/Sheep/FeatureServer/0/addFeatures");
            //设置HTTP POST请求参数必须用NameValuePair  
            List<NameValuePair> params = new ArrayList<NameValuePair>();  
            params.add(new BasicNameValuePair("f", "json"));//format设置成json
            //params.add(new BasicNameValuePair("features","[{'geometry':{'y':34,'x':108},'attributes':{'description':'addPoint','type':2}}]"));
            params.add(new BasicNameValuePair("features",makeJson()));
                    
            try {
                //设置http Post请求参数 
                HttpEntity entity = new UrlEncodedFormEntity(params);
                request.setEntity(entity); 
                HttpResponse response=client.execute(request);
                if(response.getStatusLine().getStatusCode()==200){//如果状态码为200,就是正常返回
                    String result=EntityUtils.toString(response.getEntity());
                    System.out.println(result);            
                    //需要对返回的结果进行分析,判断新增记录是成功还是失败
                    //如果成功,则进行后续的分析
                }
            } catch (ClientProtocolException e) {                            
                e.printStackTrace();
                //进行处理操作    
            } catch (IOException e) {
                //进行处理操作
            }            
        }
    备注
    1. 点击这里下载源码,开发环境:eclipse-SDK-3.7.2-win32
    2. 同样适用于Android开发,因ArcGIS Runtime for Android包含了前面提到的两个依赖包,因此可以直接使用。
  • 相关阅读:
    解决win10家庭版打不开组策略gpedit.msc
    Centos7上安装配置Redis
    Typora配置图片自动上传到图床
    SSM静态资源访问不了问题
    SSM整合
    opencv基础学习 小知识--绘图+小实战训练
    opencv基础学习详细笔记【1】--读取并显示图片
    Scikit-Learn 源码研读 (第二期)基类的实现细节
    Scikit-Learn 源码研读 (第一期)项目结构介绍
    在Win10上搭建fastai课程环境
  • 原文地址:https://www.cnblogs.com/esrichina/p/2889224.html
Copyright © 2011-2022 走看看