安卓智能地图开发与实施十二:空间查询与模糊搜索 - ArcGIS Runtime SDK for Android(Version 100.0.0)

本文介绍了GIS应用中的空间查询与模糊搜索技术,包括单图层和多图层查询的方法实现,如利用MapView进行触摸查询、利用FeatureLayer进行要素查询等,并详细展示了如何处理模糊搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

空间查询与模糊搜索

对空间查询的使用每个人都有自己的见解。从项目的角度,一般会进行单图层查询和多图层查询。移动端查询方式主要为触摸查询和文字搜索查询。

空间查询效果:

这里写图片描述

模糊搜索效果:

这里写图片描述

MapQueryResult,包含了FeatureLayer和一组Feature。FeatureLayer是当前查询的图层,一组Feature是查询的结果。

这里写图片描述

MapQueryClass,包含了回调接口IQueryResult,一组查询结果MapQueryResult,当进行单图层查询时,结果为包含一个MapQueryResult的数组。

这里写图片描述

Identify方法

1)利用MapView的identifyLayersAsync
2)利用FeatureLayer的queryFeaturesAsync
3)在2)的基础查询多个,按图层顺序返回

/***
 * 通过MapView对象上的鼠标点击,查询MapView对象中的可见图层
 * @param mainMapView
 * @param screenPoint
 * @param screenTolerance
 * @param iQueryResult
 */
public void Identify(MapView mainMapView,
                  Point screenPoint,
                  int screenTolerance,
                  IQueryResult iQueryResult) {
    mainMapQueryResult = new ArrayList<MapQueryResult>();
    mainQueryResultReturn = iQueryResult;
    final ListenableFuture<List<IdentifyLayerResult>> identifyFuture =
            mainMapView.identifyLayersAsync(screenPoint, screenTolerance, false, 100);
    identifyFuture.addDoneListener(new Runnable() {
        @Override
        public void run() {
            try {
                List<IdentifyLayerResult> identifyLayersResults = identifyFuture.get();
                for (IdentifyLayerResult identifyLayerResult : identifyLayersResults) {
                    MapQueryResult mapQueryResult = new MapQueryResult();
                    mapQueryResult.featureLayer = (FeatureLayer) identifyLayerResult.getLayerContent();
                    mapQueryResult.features = new ArrayList<Feature>();
                    for (GeoElement identifiedElement : identifyLayerResult.getElements()) {
                        identifyLayerResult.getLayerContent();
                        if (identifiedElement instanceof Feature) {
                            Feature identifiedFeature = (Feature) identifiedElement;
                            mapQueryResult.features.add(identifiedFeature);
                        }
                    }
                    mainMapQueryResult.add(mapQueryResult);
                }
                mainQueryResultReturn.getQuery();
            }
            catch (Exception e) {
            }
        }
    });
}
/***
 * 通过Geometry对象,查询一组FeatureLayer对象中的要素
 * @param featureLayers
 * @param geometry
 * @param iQueryResult
 */
public void Identify(List<FeatureLayer> featureLayers,
                  Geometry geometry,
                  IQueryResult iQueryResult) {
    final List<FeatureLayer> mainFeatureLayer = featureLayers;
    TotalCount = featureLayers.size();
    mainMapQueryResult = new ArrayList<MapQueryResult>();
    mainQueryResultReturn = iQueryResult;
    QueryParameters query = new QueryParameters();
    query.setGeometry(geometry);
    try {
        for (final FeatureLayer featureLayer : featureLayers
                ) {
            final ListenableFuture<FeatureQueryResult> featureQueryResult
                    = featureLayer.getFeatureTable().queryFeaturesAsync(query);
            featureQueryResult.addDoneListener(new Runnable() {
                @Override
                public void run() {
                    try {
                        FeatureQueryResult result = featureQueryResult.get();
                        Iterator<Feature> iterator = result.iterator();
                        MapQueryResult mapQueryResult = new MapQueryResult();
                        mapQueryResult.features = new ArrayList<Feature>();
                        Feature feature;
                        while (iterator.hasNext()) {
                            feature = iterator.next();
                            mapQueryResult.features.add(feature);
                        }
                        mapQueryResult.featureLayer = featureLayer;
                        mainMapQueryResult.add(mapQueryResult);
                        LoadedCount++;
                        if (LoadedCount == TotalCount) {
                            List<MapQueryResult> mainNewMapQueryResult =
                                    new ArrayList<MapQueryResult>();
                            for (int i = 0; i < mainFeatureLayer.size(); i++) {
                                for (MapQueryResult mapQueryResult1 : mainMapQueryResult
                                        ) {
                                    if (mapQueryResult1.featureLayer.equals(mainFeatureLayer.get(i))) {
                                        if (mapQueryResult1.features.size() > 0) {
                                            mainNewMapQueryResult.add(mapQueryResult1);
                                        }
                                        break;
                                    }
                                }
                            }
                            mainMapQueryResult = mainNewMapQueryResult;
                            mainQueryResultReturn.getQuery();
                        }
                    } catch (Exception e) {

                    }
                }
            });
        }

    } catch (Exception e) {

    }
}
/***
 * 通过Geometry对象,查询一个FeatureLayer对象中的要素
 * @param featureLayer
 * @param geometry
 * @param iQueryResult
 */
public void Identify(FeatureLayer featureLayer,
                  Geometry geometry,
                  IQueryResult iQueryResult) {
    try {
        final FeatureLayer mainFeatureLayer = featureLayer;
        mainMapQueryResult = new ArrayList<MapQueryResult>();
        mainQueryResultReturn = iQueryResult;
        QueryParameters query = new QueryParameters();
        query.setGeometry(geometry);
        if(featureLayer.getFeatureTable().getGeometryType() == GeometryType.POLYGON)
        {
            query.setSpatialRelationship(QueryParameters.SpatialRelationship.INTERSECTS);
        }
        final ListenableFuture<FeatureQueryResult> featureQueryResult
                = featureLayer.getFeatureTable().queryFeaturesAsync(query);
        featureQueryResult.addDoneListener(new Runnable() {
            @Override
            public void run() {
                try {
                    FeatureQueryResult result = featureQueryResult.get();
                    Iterator<Feature> iterator = result.iterator();
                    MapQueryResult mapQueryResult = new MapQueryResult();
                    mapQueryResult.features = new ArrayList<Feature>();
                    Feature feature;
                    while (iterator.hasNext()) {
                        feature = iterator.next();
                        mapQueryResult.features.add(feature);
                    }
                    mapQueryResult.featureLayer = mainFeatureLayer;
                    mainMapQueryResult.add(mapQueryResult);
                    mainQueryResultReturn.getQuery();
                } catch (Exception e) {
                }
            }
        });
    } catch (Exception e) {

    }
}

Select方法

1)利用FeatureLayer的selectFeaturesAsync
2)在1)的基础查询多个,按图层顺序返回

/***
 * 通过Geometry对象,选择一个FeatureLayer对象中的要素
 * @param featureLayer
 * @param geometry
 * @param iQueryResult
 */
public void Select(FeatureLayer featureLayer,
                  Geometry geometry,
                  IQueryResult iQueryResult) {
    try {
        final FeatureLayer mainFeatureLayer = featureLayer;
        mainMapQueryResult = new ArrayList<MapQueryResult>();
        mainQueryResultReturn = iQueryResult;
        QueryParameters query = new QueryParameters();
        query.setGeometry(geometry);
        if(featureLayer.getFeatureTable().getGeometryType() == GeometryType.POLYGON
                || featureLayer.getFeatureTable().getGeometryType() == GeometryType.POLYLINE)
        {
            query.setSpatialRelationship(QueryParameters.SpatialRelationship.INTERSECTS);
        }
        final ListenableFuture<FeatureQueryResult> featureQueryResult
                = featureLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.NEW);
        featureQueryResult.addDoneListener(new Runnable() {
            @Override
            public void run() {
                try {
                    mainFeatureLayer.clearSelection();
                    FeatureQueryResult result = featureQueryResult.get();
                    Iterator<Feature> iterator = result.iterator();
                    MapQueryResult mapQueryResult = new MapQueryResult();
                    mapQueryResult.features = new ArrayList<Feature>();
                    Feature feature;
                    while (iterator.hasNext()) {
                        feature = iterator.next();
                        mapQueryResult.features.add(feature);
                    }
                    mapQueryResult.featureLayer = mainFeatureLayer;
                    mainMapQueryResult.add(mapQueryResult);
                    mainQueryResultReturn.getQuery();
                } catch (Exception e) {
                }
            }
        });
    } catch (Exception e) {

    }
}

/***
 * 通过Geometry对象,选择一组FeatureLayer对象中的要素
 * @param featureLayers
 * @param geometry
 * @param iQueryResult
 */
public void Select(List<FeatureLayer> featureLayers,
                  Geometry geometry,
                  IQueryResult iQueryResult) {
    final List<FeatureLayer> mainFeatureLayer = featureLayers;
    TotalCount = featureLayers.size();
    mainMapQueryResult = new ArrayList<MapQueryResult>();
    mainQueryResultReturn = iQueryResult;
    QueryParameters query = new QueryParameters();
    query.setGeometry(geometry);
    try {
        for (final FeatureLayer featureLayer : featureLayers
                ) {
            final ListenableFuture<FeatureQueryResult> featureQueryResult
                    = featureLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.NEW);
            featureQueryResult.addDoneListener(new Runnable() {
                @Override
                public void run() {
                    try {
                        featureLayer.clearSelection();
                        FeatureQueryResult result = featureQueryResult.get();
                        Iterator<Feature> iterator = result.iterator();
                        MapQueryResult mapQueryResult = new MapQueryResult();
                        mapQueryResult.features = new ArrayList<Feature>();
                        Feature feature;
                        while (iterator.hasNext()) {
                            feature = iterator.next();
                            mapQueryResult.features.add(feature);
                        }
                        mapQueryResult.featureLayer = featureLayer;
                        mainMapQueryResult.add(mapQueryResult);
                        LoadedCount++;
                        if (LoadedCount == TotalCount) {
                            List<MapQueryResult> mainNewMapQueryResult =
                                    new ArrayList<MapQueryResult>();
                            for (int i = 0; i < mainFeatureLayer.size(); i++) {
                                for (MapQueryResult mapQueryResult1 : mainMapQueryResult
                                        ) {
                                    if (mapQueryResult1.featureLayer.equals(mainFeatureLayer.get(i))) {
                                        if (mapQueryResult1.features.size() > 0) {
                                            mainNewMapQueryResult.add(mapQueryResult1);
                                        }
                                        break;
                                    }
                                }
                            }
                            mainMapQueryResult = mainNewMapQueryResult;
                            mainQueryResultReturn.getQuery();
                        }
                    } catch (Exception e) {

                    }
                }
            });
        }

    } catch (Exception e) {

    }
}

Search方法

1)利用FeatureLayer的queryFeaturesAsync
2)在1)的基础查询多个,按图层顺序返回
注:可设定空间范围进行查询

/***
 * 通过输入的文本(数字),查询一个FeatureLayer对象中的要素
 * @param featureLayer
 * @param search
 * @param iQueryResult
 */
public void Search(FeatureLayer featureLayer,
                   String search,
                   IQueryResult iQueryResult){
    Search(featureLayer,search,iQueryResult,null);
}

/***
 * 通过输入的文本(数字),查询一个FeatureLayer对象中指定范围内的要素
 * @param featureLayer
 * @param search
 * @param iQueryResult
 * @param geometry
 */
public void Search(FeatureLayer featureLayer,
                   String search,
                   IQueryResult iQueryResult,
                   Geometry geometry) {
    final FeatureLayer mainFeatureLayer = featureLayer;
    mainMapQueryResult = new ArrayList<MapQueryResult>();
    mainQueryResultReturn = iQueryResult;
    QueryParameters query = new QueryParameters();
    String whereStr = GetWhereStrFunction(featureLayer,search);
    query.setWhereClause(whereStr);
    if(geometry != null)
    {
        query.setGeometry(geometry);
    }
    final ListenableFuture<FeatureQueryResult> featureQueryResult
            = featureLayer.getFeatureTable().queryFeaturesAsync(query);
    featureQueryResult.addDoneListener(new Runnable() {
        @Override
        public void run() {
            try {
                FeatureQueryResult result = featureQueryResult.get();
                Iterator<Feature> iterator = result.iterator();
                MapQueryResult mapQueryResult = new MapQueryResult();
                mapQueryResult.features = new ArrayList<Feature>();
                Feature feature;
                while (iterator.hasNext()) {
                    feature = iterator.next();
                    mapQueryResult.features.add(feature);
                }
                mapQueryResult.featureLayer = mainFeatureLayer;
                mainMapQueryResult.add(mapQueryResult);
                mainQueryResultReturn.getQuery();
            } catch (Exception e) {

            }
        }
    });
}
/***
 * 通过输入的文本(数字),查询一组FeatureLayer对象中的要素
 * @param featureLayers
 * @param search
 * @param iQueryResult
 */
public void Search(List<FeatureLayer> featureLayers,
                   String search,
                   IQueryResult iQueryResult){
    Search(featureLayers,search,iQueryResult,null);
}
/***
 * 通过输入的文本(数字),查询一组FeatureLayer对象中指定范围内的要素
 * @param featureLayers
 * @param search
 * @param iQueryResult
 * @param geometry
 */
public void Search(List<FeatureLayer> featureLayers,
                   String search,
                   IQueryResult iQueryResult,
                   Geometry geometry) {
    final List<FeatureLayer> mainFeatureLayer = featureLayers;
    TotalCount = featureLayers.size();
    mainMapQueryResult = new ArrayList<MapQueryResult>();
    mainQueryResultReturn = iQueryResult;

    try {
        for (final FeatureLayer featureLayer : featureLayers
                ) {
            QueryParameters query = new QueryParameters();
            String whereStr = GetWhereStrFunction(featureLayer,search);
            query.setWhereClause(whereStr);
            if(geometry != null)
            {
                query.setGeometry(geometry);
            }
            final ListenableFuture<FeatureQueryResult> featureQueryResult
                    = featureLayer.getFeatureTable().queryFeaturesAsync(query);
            featureQueryResult.addDoneListener(new Runnable() {
                @Override
                public void run() {
                    try {
                        FeatureQueryResult result = featureQueryResult.get();
                        Iterator<Feature> iterator = result.iterator();
                        MapQueryResult mapQueryResult = new MapQueryResult();
                        mapQueryResult.features = new ArrayList<Feature>();
                        Feature feature;
                        while (iterator.hasNext()) {
                            feature = iterator.next();
                            mapQueryResult.features.add(feature);
                        }
                        mapQueryResult.featureLayer = featureLayer;
                        mainMapQueryResult.add(mapQueryResult);
                        LoadedCount++;
                        if (LoadedCount == TotalCount) {
                            List<MapQueryResult> mainNewMapQueryResult =
                                    new ArrayList<MapQueryResult>();
                            for (int i = 0; i < mainFeatureLayer.size(); i++) {
                                for (MapQueryResult mapQueryResult1 : mainMapQueryResult
                                        ) {
                                    if (mapQueryResult1.featureLayer.equals(mainFeatureLayer.get(i))) {
                                        if (mapQueryResult1.features.size() > 0) {
                                            mainNewMapQueryResult.add(mapQueryResult1);
                                        }
                                        break;
                                    }
                                }
                            }
                            mainMapQueryResult = mainNewMapQueryResult;
                            mainQueryResultReturn.getQuery();
                        }
                    } catch (Exception e) {

                    }
                }
            });
        }

    } catch (Exception e) {

    }
}

处理模糊搜索

public static String GetWhereStrFunction(FeatureLayer featureLayer, String search) {
    StringBuilder stringBuilder = new StringBuilder();
    List<Field> fields = featureLayer.getFeatureTable().getFields();
    boolean isNumber = AttributeMethodsClass.isNumberFunction(search);
    for (Field field : fields
            ) {
        switch (field.getFieldType()) {
            case TEXT:
                stringBuilder.append(" upper(");
                stringBuilder.append(field.getName());
                stringBuilder.append(") LIKE '%");
                stringBuilder.append(search.toUpperCase());
                stringBuilder.append("%' or");
                break;
            case SHORT:
            case INTEGER:
            case FLOAT:
            case DOUBLE:
            case OID:
                if(isNumber == true)
                {
                    stringBuilder.append(" upper(");
                    stringBuilder.append(field.getName());
                    stringBuilder.append(") = ");
                    stringBuilder.append(search);
                    stringBuilder.append(" or");
                }
                break;
            case UNKNOWN:
            case GLOBALID:
            case BLOB:
            case GEOMETRY:
            case RASTER:
            case XML:
            case GUID:
            case DATE:
                break;
        }
    }
    String result = stringBuilder.toString();
    return result.substring(0,result.length()-2);
}

判断文本是否数字

public static boolean isNumberFunction(String string)
{
    boolean result = false;
    Pattern pattern = Pattern.compile("^[-+]?[0-9]");
    if(pattern.matcher(string).matches()){
        //数字
        result = true;
    } else {
        //非数字
    }
        //带小数的
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append('^');
    stringBuilder.append('[');
    stringBuilder.append("-+");
    stringBuilder.append("]?[");
    stringBuilder.append("0-9]+(");
    stringBuilder.append('\\');
    stringBuilder.append(".[0-9");
    stringBuilder.append("]+)");
    stringBuilder.append("?$");
    Pattern pattern1 = Pattern.compile(stringBuilder.toString());
    if(pattern1.matcher(string).matches()){
        //数字
        result = true;
    } else {
        //非数字
    }
    return  result;
}

使用示例

protected void StartMapTouchFunction(){
    mainMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this,mainMapView) {
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            android.graphics.Point screenPoint =
                    new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY()));
            final MapQueryClass mapQueryClass = new MapQueryClass();
            mapQueryClass.Identify(
                    mainMapView,
                    screenPoint,
                    5,
                    new IQueryResult() {
                        @Override
                        public void getQuery() {
                            List<MapQueryClass.MapQueryResult> mapQueryResults= mapQueryClass.getMapQueryResult();
                            for (MapQueryClass.MapQueryResult mapQueryResult:mapQueryResults
                                 ) {
                            }
                        }
                    }
            );
            return super.onSingleTapConfirmed(e);
        }
    });
}
您好,我可以回答您的问题。以下是代码示例: #include <reg52.h> #include <stdio.h> sbit LED = P1^0; // LED连接的IO sbit DQ = P3^7; // DS18B20连接的IO unsigned char code table[] = { // 数码管显示0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; void delay(unsigned int i) { // 延时函数 while(i--); } void init_ds18b20() { // 初始化DS18B20 unsigned char i; DQ = 1; delay(5); DQ = 0; delay(500); DQ = 1; delay(50); i = DQ; delay(500); } void write_ds18b20(unsigned char dat) { // 写入一个字节 unsigned char i; for(i=0; i<8; i++) { DQ = 0; DQ = dat & 0x01; delay(5); DQ = 1; dat >>= 1; } } unsigned char read_ds18b20() { // 读取一个字节 unsigned char i, dat = 0; for(i=0; i<8; i++) { DQ = 0; dat >>= 1; DQ = 1; if(DQ) dat |= 0x80; delay(5); } return dat; } void start_ds18b20() { // 启动温度转换 init_ds18b20(); write_ds18b20(0xcc); write_ds18b20(0x44); } int read_temperature() { // 读取温度值 unsigned char tl, th; int temp; init_ds18b20(); write_ds18b20(0xcc); write_ds18b20(0xbe); tl = read_ds18b20(); th = read_ds18b20(); temp = th; temp <<= 8; temp |= tl; return temp; } void display_temperature(int temp) { // 显示温度值 unsigned char i, j, k; unsigned char code disp[] = { // 数码管连接的IO 0xfe, 0xfd, 0xfb, 0xf7 }; unsigned char buf[4]; sprintf(buf, "%.1f", temp / 16.0); for(i=0; i<4; i++) { j = buf[i] - &#39;0&#39;; k = table[j]; P2 = disp[i]; P0 = k; delay(100); } } void main() { int temp, set_temp = 25; unsigned char i; while(1) { start_ds18b20(); temp = read_temperature(); display_temperature(temp); if(temp > set_temp * 16) { // 温度高于设定值 for(i=0; i<6; i++) { // LED闪烁3秒 LED = ~LED; delay(500); } } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

虾神说D

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值