基于SuperMap的iMobile 3D总结(三)

本文探讨了在移动端应用中使用PopupWindow显示信息的方法,以及通过Geometry和SQL查询从iServer获取并渲染GIS数据的具体实现。文章详细介绍了PopupWindow的定位与显示,Geometry查询的构造,以及如何通过SQL查询特定字段并高亮显示对应图形。
1、popupWindow 
popupWindow = new PopupWindow(view, 611, 603);
tvUserName.setText(userName);
// 使其聚集
popupWindow.setFocusable(true);
// 设置允许在外点击消失
popupWindow.setOutsideTouchable(true);
popupWindow.setBackgroundDrawable(new BitmapDrawable());
WindowManager windowManager = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE);
// 显示的位置为:屏幕的宽度的一半-PopupWindow的高度的一半
int xPos = windowManager.getDefaultDisplay().getWidth() / 2
        - popupWindow.getWidth() / 2;
int yPos = windowManager.getDefaultDisplay().getHeight() / 2 - popupWindow.getHeight() / 2 - 200;
Log.i("coder", "xPos:" + xPos);
popupWindow.showAsDropDown(convertView, xPos, yPos);

2、Geometry查询

  private void queryPointbyGeometry(Point2D point2D, String dataSource, String dataSet) {
        com.supermap.services.components.commontypes.Geometry geometry = new com.supermap.services.components.commontypes.Geometry();
        com.supermap.services.components.commontypes.Point2D[] points = new com.supermap.services.components.commontypes.Point2D[]{new com.supermap.services.components.commontypes.Point2D(
                point2D.getX(), point2D.getY())};
        geometry.points = points;
        geometry.type = GeometryType.POINT;
        GetFeaturesResult result = excute_geometryQuery(Constant.QUERY_B13, geometry);
        if (result != null && result.featureCount > 0) {
            Feature[] features = result.features;
            String[] fieldValues = features[0].fieldValues;
            int id = Integer.parseInt(fieldValues[0]);
            int[] selectIds = new int[]{id};

            Layer3Ds layers = sceneControl.getScene().getLayers();
            for (int i = 0; i < layers.getCount(); i++) {
                if (layers.get(i).getName().equalsIgnoreCase("b13@udb13")) {
                    Layer3D layer3D = layers.get(i);
                    b13dosgFile = (Layer3DOSGBFile) layer3D;
                }
            }
            b13dosgFile.clearObjectsColor();
            b13dosgFile.setObjectsColor(selectIds, new Color(255, 0, 0));
            feature = features[0];
            handler.sendEmptyMessage(1000);
        } else {
            handler.sendEmptyMessage(1001);
        }
    }

3、点击item,scene里面高亮对应图形

  Feature feature = featureList.get(position);
                Geometry geometry = feature.geometry;
                Point2D[] points = geometry.points;
//                Log.e("msg", geometry.getCenter().x + "-" + geometry.getCenter().y + "-------");
                sceneControl.getScene().fly(new LookAt(points[0].x, points[0].y, 120), 1000, true);
                int[] ids = new int[]{feature.getID()};
                Layer3Ds layers = sceneControl.getScene().getLayers();
                for (int i = 0; i < layers.getCount(); i++) {
                    if (layers.get(i).getName().equalsIgnoreCase("b13@udb13")) {
                        Layer3D layer3D = layers.get(i);
                        Layer3DOSGBFile layer3dosgbfile = (Layer3DOSGBFile) layer3D;
                        layer3dosgbfile.clearObjectsColor();
//                        layer3dosgbfile.removeObjectsColor(selectIds);
                        layer3dosgbfile.setObjectsColor(ids, new Color(255, 0, 0));
                    }
                }

4、获取iServer里面的需要的字段

 public static final String FIELD_B13 = "http://192.168.5.229:8090/iserver/services/data-b13Mobile/rest/data/datasources/udb13/datasets/b13_polygon/fields.json"; 

/**
     * init field values
     */
    private void initQueryFields() {

        OkHttpClient client = new OkHttpClient();
        Request build = new Request.Builder().url(Constant.FIELD_B13).get().build();
        Call call = client.newCall(build);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("msg", e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response != null) {
                    String string = response.body().string();
                    Log.e("msg", string + "");
                    try {
                        JSONObject jsonObject = new JSONObject(string);
                        JSONArray fieldNames = jsonObject.getJSONArray("fieldNames");
                        queryFields = new String[fieldNames.length()];
                        for (int i = 0; i < fieldNames.length(); i++) {
                            Object o = fieldNames.get(i);
                            Log.e("msg", o.toString() + "");
                            queryFields[i] = o.toString();
                        }
                        handler.sendEmptyMessage(100);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

5、属性查询、渲染图层

    //b13的查询路径
public static final String QUERY_B13 = "http://192.168.5.229:8090/iserver/services/data-b13Mobile/rest/data";

  Layer3Ds layers = sceneControl.getScene().getLayers();
                for (int i = 0; i < layers.getCount(); i++) {
                    if (layers.get(i).getName().equalsIgnoreCase("b13@udb13")) {
                        Layer3D layer3D = layers.get(i);
                        b13dosgFile = (Layer3DOSGBFile) layer3D;
                    }
                }
   clearMapColor();
   queryPointbySQL("udb13", "b13_polygon", sql, Constant.QUERY_B13);
 /**
     * clear b13area model color
     */
    private void clearMapColor() {
        b13dosgFile.clearObjectsColor();
    }

    /**
     * query b13 data url by sql
     */
    private void queryPointbySQL(String dataSource, String dataSet, String sql, String url) {
        String[] dtnames = {dataSource + ":" + dataSet};
        QueryParameter parameter = new QueryParameter();
        parameter.attributeFilter = sql;
        GetFeaturesBySQLParameters sqlParameters = new GetFeaturesBySQLParameters();
        sqlParameters.datasetNames = dtnames;
        sqlParameters.queryParameter = parameter;
        GetFeaturesBySQLService sqlService = new GetFeaturesBySQLService(url);
        MyEventListener eventListener = new MyEventListener();
        sqlService.process(sqlParameters, eventListener);
    }


 /**
     * 要素请求服务监听
     */
    class MyEventListener extends GetFeaturesByGeometryService.GetFeaturesEventListener {
        @Override
        public void onGetFeaturesStatusChanged(Object o, EventStatus eventStatus) {
            if (EventStatus.PROCESS_COMPLETE.getValue() == eventStatus.getValue() && o != null) {
                featuresResult = (GetFeaturesResult) o;
                Feature[] featuresarr = featuresResult.features;
                for (int i = 0; i < featuresarr.length; i++) {
                    featureList.add(featuresarr[i]);
                }
                /*for (int i = 0; i < features.length; i++) {
                    String[] fieldNames = features[i].fieldNames;
                    String[] fieldValues = features[i].fieldValues;
                }*/
                Log.i("查询:", "成功");
                handler.sendEmptyMessage(101);
              /*  queryAdapter = new Query2Adapter(getActivity(), feature);
                rcvQuery.setAdapter(queryAdapter);*/
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShineMan-

走过路过不要错过,一分钱也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值