ArcGIS Mobile 路口定位(二)

          在实际过程中,有可能我们只记得一条道路名称,另外一条相交道路不记得了,甚至不知道两条道路会不会相交产生路口!这时我们可以在在选择一条道路时,自动列出与之有路口的所有道路。

         不过计算前我们要得到一些信息,所选道路的RoadID(唯一),道路图层名称layername

 1             
 2             string layername="dlmc";//道路图层名称
 3               string roadid=1000”;//道路ID  
 4               ListBox newlb=new ListBox();     
 5             MobileServiceLayer msl = ms.Layers[layername] as MobileServiceLayer;
 6             FeatureLayer fl = msl as FeatureLayer;
 7             /* geo为道路Geometry */
 8             QueryFilter qf = new QueryFilter(geo, GeometricRelationshipType.Intersect);
 9 
10             using (FeatureDataReader fdr = fl.GetDataReader(qf))
11             {
12                 DateTime begtime = DateTime.Now;
13                 TimeSpan ts;//当相交道路过多时,会计算超时
14                 while (fdr.Read())
15                 {
16                     if (fdr["ROADID"].ToString() != roadid)
17                     {
18                         Polyline intersectgeo = fdr.GetGeometry() as Polyline;
19                       
20                         newlb.Items.Add(Convert.ToString(fdr["ROADNAME"]));
21                     }
22                     DateTime endtime = DateTime.Now;
23                     ts = endtime - begtime;
24                     if (ts.TotalSeconds > 30)//计算30秒以后超时
25                     {
26                         MessageBox.Show("选择的道路过长,计算超时!""用户提示");
27                     }
28                 }
29             }
30           
31         }

 

      在相交道路列表中选择道路,计算路口,在我的上一篇文章中的计算不是很好,没有进行过优化。优化的思路如下:首先判断两条道路拥有一个路口或是两个及两个以上的交叉路口,然后比较两条道路的长短,选择短的一条道路打断成点,计算后,如果找到一个路口后做一个判断,要是两条道路仅有一个路口,结束计算,返回路口,否则继续计算,寻找路口。(用RoadA.Relate(RoadB,GeometricRelationshipType.Touch)做判断是否有两个路口,一个返回false)。

    顺便啰嗦几句,显示路口时的方法,要经过两个判断:1.比例尺比较 2.路口是否在显示范围内

    比例尺比较用featruelayer.InScaleRange(Map.Scale)做判断

    范围判断,我自己写了个函数

  

      /// <summary>
        /// 判断点是否在指定区域内
        /// </summary>
        /// <param name="_cd">坐标</param>
        /// <param name="_ev">指定区域</param>
        /// <returns></returns>
        public static bool PointInEnvelop(coordinate _cd, Envelope _ev)
        {            
            double evcenterx = _ev.XCenter;
            double evcentery = _ev.YCenter;
            double minx = evcenterx - _ev.Width / 2;
            double maxx = evcenterx + _ev.Width / 2;
            double miny = evcentery - _ev.Height / 2;
            double maxy = evcentery + _ev.Height / 2;

            if (cd.X > minx && cd.X < maxx && cd.Y > miny && cd.Y < maxy)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

关于路口定位方面的学习心得都在这里,有不足的地方请大家指出

   

       

        

         

posted on 2010-02-25 15:17  风之恋  阅读(647)  评论(2编辑  收藏  举报

导航