ArcGIS Mobile 路口定位(二)
在实际过程中,有可能我们只记得一条道路名称,另外一条相交道路不记得了,甚至不知道两条道路会不会相交产生路口!这时我们可以在在选择一条道路时,自动列出与之有路口的所有道路。
不过计算前我们要得到一些信息,所选道路的RoadID(唯一),道路图层名称layername
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;
}
}
关于路口定位方面的学习心得都在这里,有不足的地方请大家指出