zoukankan      html  css  js  c++  java
  • 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;
                }
            }

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

       

           

            

             

  • 相关阅读:
    Linux下Nginx配置文件nginx.conf默认位置修改
    centos下安装Nginx
    让网站永久拥有免费HTTPS(SSL)
    Perl深度优先迷宫算法
    Perl字符贪吃蛇
    Linux静态路由配置
    Linux虚拟机网络配置
    Perl快速查找素数
    Shell同步数据到oracle数据库
    Shell修改密码为原密码
  • 原文地址:https://www.cnblogs.com/MyLucifer/p/1673497.html
Copyright © 2011-2022 走看看