点查询点的实现

图形查询利用的是查询图形与被查询图形的拓扑关系,因而点查询点的方式是利用点与点之间的拓扑关系的,而点与点之间的只有重合(点的坐标完全一致)、相离两种,当我点击地图上某点时坐标不可能与要查询的点要素完全一致,因此重合的方式是不可取的,再看ArcGIS api for Silverlight中提供的查询拓扑关系如下:

SpatialRelationship.esriSpatialRelContainsPart or all of a feature from feature class 1 is contained within a feature from feature class 2,要素一局部或全部包含在要素二中(包含、局部包含);

esriSpatialRelEnvelopeIntersects:The feature from feature class 1 crosses a feature from feature class 2,要素一穿过要素二(线线、线面、面面相交);

esriSpatialRelEnvelopeIntersects:The envelope of feature class 1 intersects with the envelope of feature class 2,要素一的外接矩形与要素二的外接矩形相交;

esriSpatialRelIndexIntersects:The envelope of the query feature class intersects the index entry for the target feature class,查询图形的外接矩形与目标要素相交;

esriSpatialRelIntersects:Part of a feature from feature class 1 is contained in a feature from feature class 2,要素一的一部分包含在要素二中(包含、相交);

esriSpatialRelOverlaps:Features from feature class 1 overlap features in feature class 2,要素一与要素二重叠(重叠关系);

esriSpatialRelRelation:Indicates that a spatial relationship function will be used,用于特殊的空间关系,即可用于自定义上述几种空间关系的组合;

esriSpatialRelTouches:The feature from feature class 1 touches the border of a feature from feature class 2,要素一与要素二的边缘相接(相邻);

esriSpatialRelWithin:The feature from feature class 1 is completely enclosed by the feature from feature class 2,要素一完全在要素二内(包含)

由上可得,Api提供的空间关系不适用于点查询点,那么可以通过其他方式实现,比如说,将查询点扩散成面,这样即成为查询点周围一定区域内的要素了,点化面代码如下:

复制代码
 1         /// <summary>
 2         /// 以当前点作为中心点获取一定方框范围
 3         /// </summary>
 4         /// <param name="mapExtent"></param>当前地图范围
 5         /// <param name="point"></param>地图中心点
 6         /// <param name="pct"></param>获取方框范围的比例系数
 7         /// <returns></returns>
 8         private Envelope Expand(Envelope mapExtent, MapPoint point, double pct)
 9         {
10             return new Envelope(
11                     point.X - mapExtent.Width * (pct / 2), point.Y - mapExtent.Height * (pct / 2),
12                     point.X + mapExtent.Width * (pct / 2), point.Y + mapExtent.Height * (pct / 2))
13             {
14                 SpatialReference = mapExtent.SpatialReference
15             };
16         }
复制代码

查询的完整代码如下

复制代码
 private QueryTask task;
 private Query query;
private void Window_Loaded(object sender, RoutedEventArgs e)
        {
           
            task = new QueryTask();
            task.ExecuteCompleted += new EventHandler<QueryEventArgs>(task_ExecuteCompleted);
            task.Failed += new EventHandler<TaskFailedEventArgs>(task_Failed);
            task.Url =“http://***/arcgis/rest/services/***/FeatureServer/0”;
            query = new Query();
            query.SpatialRelationship = SpatialRelationship.esriSpatialRelIntersects;
            query.ReturnGeometry = true;
            query.OutFields.Add("*");//默认输出字段为全部
            query.OutSpatialReference = map1.SpatialReference;
        }
         void task_Failed(object sender, TaskFailedEventArgs e)
        {
            MessageBox.Show("查询失败");
            map1.Cursor = System.Windows.Input.Cursors.Help;
        }

        void task_ExecuteCompleted(object sender, QueryEventArgs e)
        {
            
            String content = "";
            if (e.IdentifyResults==null ||e.IdentifyResults.Count<=0)
            {
               map1.Cursor = System.Windows.Input.Cursors.Help;
                return;
            }
            Graphic g = e.IdentifyResults[0].Feature;
           
                foreach (var item in g.Attributes)
                {
                    content += item.Key + ":";
                    content += item.Value+"\n";
                }
                infoWindow1.IsOpen = false;
                if (e.IdentifyResults != null && e.IdentifyResults .Count > 0)
                {
                    lblContent.Content = content;//显示内容
                    //  infoWindow1.Anchor = set.Features[0].Geometry.Extent.GetCenter();
                    infoWindow1.Anchor = selPoint;//显示位置
                    infoWindow1.IsOpen = true;
                }
               map1.Cursor = System.Windows.Input.Cursors.Help;
        }

 private void map1_MouseClick(object sender, Map.MouseEventArgs e)
        {
                   query.MaxAllowableOffset = 5;
                  
                    
                    query.Geometry = this.Expand(map1.Extent,e. MapPoint,0.03);
                   // query.Geometry = e.Geometry;
                    task.ExecuteAsync(query);
                    map1.Cursor = System.Windows.Input.Cursors.Wait;
                    break;
        }
复制代码

效果入下:

事实上在具体实现中,要控制查询的精度,可以根据不同的比例尺,更改点扩散为面的距离范围。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值