首页 / 浏览问题 / 移动GIS / 问题详情
移动端,除了setOnTouchListener还有能获取坐标的方法吗?
66EXP 2020年11月02日
setOnTouchListener启用后,点击地图会出现不能移动的情况,这要怎么解决呢?或者有别的点击事件也可以获取屏幕坐标转成经纬度坐标,进行替代?

1个回答

您好,设置地图监听是不会影响地图的移动的,可以参考以下代码:
 

m_mapcontrol.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:
                //获取鼠标点
                Point pointMouse = new Point(x, y);
                //将地图中指定点的像素坐标转换为地图坐标
                Point2D point = m_mapcontrol.getMap().pixelToMap(pointMouse);
                //显示鼠标点的地理坐标
                double longitude = point.getX();
                double latitude = point.getY();
                Log.i("经度", String.valueOf(longitude));
                break;
        }
        return false;
    }
});
9,232EXP 2020年11月02日

我是这样写的,是因为循环太多了操作不过来吗?

/*************************/

mapControl.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        //获取鼠标点
        Point pointMouse = new Point(x, y);
        //将地图中指定点的像素坐标转换为地图坐标
        Point2D point = map.pixelToMap(pointMouse);
        //显示鼠标点的地理坐标
        double longitude = point.getX();
        double latitude = point.getY();
        //获取本地图层参数信息
        getLocalLayerParamInfo(longitude, latitude);
        return true;
    }
});

/***********************/

/**
     * 获取本地图层参数信息
     */
    public void getLocalLayerParamInfo(double longitude, double latitude) {
        GeoPoint geoPoint = new GeoPoint(longitude, latitude);

        QueryParameter queryParameter = new QueryParameter();
        queryParameter.setCursorType(CursorType.STATIC);
        queryParameter.setHasGeometry(true);
        queryParameter.setSpatialQueryMode(SpatialQueryMode.WITHIN);// 设置空间查询模式——被包含
        queryParameter.setSpatialQueryObject(geoPoint);
        //
        oneLayer = true;
        ArrayList<String> fieldInfosList = new ArrayList<String>();
        ArrayList<String> fieldNameList = new ArrayList<String>();
        //地图图层循环
        for (int i = 0; i < map.getLayers().getCount(); i++) {
            //地图图层列表名称
            String layerName = map.getLayers().get(i).getName();
            //图层控制列表循环
            for (int k = 0; k < filenameslist.size(); k++) {
                //图层控制列表名称
                String itemListName = filenameslist.get(k) + "@" + Constants.mapName;
                //图层名是否一致 && 当前图层不为null && 循环中第一次进入方法
                if (layerName.equals(itemListName) && map.getLayers().get(itemListName) != null && oneLayer) {
                    DatasetVector countyDtvRegion = (DatasetVector) map.getLayers().get(itemListName).getDataset();
                    if (countyDtvRegion != null) {
                        FieldInfos fieldInfos = countyDtvRegion.getFieldInfos();
                        Recordset countyRecRegion = countyDtvRegion.query(queryParameter);//查询记录集
                        //循环获取recordset
                        countyRecRegion.moveFirst();
                        for (int j = 0; j < fieldInfos.getCount(); j++) {
                            //过滤掉以Sm打头的系统字段
                            if (!"Sm".equals(fieldInfos.get(j).getName().substring(0, 2))) {
                                fieldNameList.add(fieldInfos.get(j).getName());
                            }
                        }
//                        while (!countyRecRegion.isEOF()) {
//                            //防穿透,除了第一次进入为true,后面进入都为false
//                            oneLayer = false;
//                            String FieldValues = String.valueOf(countyRecRegion.getFieldValue(fieldInfos.get(j).getName()));
//                            fieldInfosList.add(FieldValues);
//                            countyRecRegion.moveNext();
//                        }
                        for (int j = 0; j < fieldNameList.size(); j++) {
                            //防穿透,除了第一次进入为true,后面进入都为false
                            oneLayer = false;
                            String FieldValues = String.valueOf(countyRecRegion.getFieldValue(fieldNameList.get(j)));
                            fieldInfosList.add(FieldValues);
                        }
                        countyRecRegion.dispose();
                    }
                }

            }
        }

}

我需要点击地图,根据点坐标查询图层数据
你可以调试下代码,是不是你写了一个死循环,正常情况下是不影响的,你可以把你查询的代码注释掉看能不能移动
...