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;
                }
            }

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

       

           

            

             

  • 相关阅读:
    WebService到底是什么?(转)
    C# 页面抓取获取快递信息
    SQL Server ->> 条件筛选做法之 -- IN(VALUE1,VALUE2,...)与INNER JOIN STRING_SPLIT()性能对比
    SQL Server ->> MSDB.DBO.AGENT_DATETIME函数从整型转时间日期格式
    Windows ->> Windows Server 2012打开管理添加“我的电脑”桌面图标途径
    Windows ->> Windows下安装MSI程序遇到2503和2502错误
    SQL Server ->> DAC(Dedicated Administrator Connection)专用管理员连接
    SQL Server ->> 高可用与灾难恢复(HADR)技术之 -- Transaction Replication(事务复制)
    SQL Server ->> ColumnStore Index(列存储索引)
    SQL Server ->> 使用Azure Active Directory Authentication连接到Azure SQL Database
  • 原文地址:https://www.cnblogs.com/MyLucifer/p/1673497.html
Copyright © 2011-2022 走看看