如何在arcgis中计算线段交点间的交点

arcgis中求点与点、点与线之间的-1
点 到河流的最短距离,不知道在 ArcGIS 哪里计算?...来检查图中有无多余的线段和点与线分离的 过远,...首先点一个已知方向的点,这是会有一条线出来,你...
由一系列不同类别的点 要素和线要素(可以度量并能...这里的添加 出发点或者目的点,是往“Facilities”或...在ArcGIS中求任意两点间... 7页 免费 最短路径在...
线段和点与线分离的 过远,多次输入 0.1 和 0....三、ArcGIS 点、线、面数据拓扑处理 1. 线自动...为了做到这一点,GIS 软件中包含的 工具必须要能够...
2.1.1 点与线?中垂线(平分且垂直线段 , 线上任一点到两端的距 离相等) ?距离: (1)两点之间,线段最短; 点到直线的距离为垂线 段; ? ? 线的垂线有且...
ARCGIS常用_计算机软件及应用_IT/计算机_专业资料。用...线+点,线层中的终点必须和点层的部分(或全部)点...来检查图中有无多余的线段和点与线分离的过远,...
这条路线就是线 段 AB.这也就是我们平时所说的, 两点之间, 最短. 此时...射线 BA 与射线 BC 是同一条射线 2 平面上有四个点,经过每两个点作一条...
ARCGIS空间查询关系总结_自然科学_专业资料。ARCGIS 空间...除点与点之间的关系外,其它的要素之间都可以具有该...素中的最高维数低一),面与点,点与线(二个要素...
这时点击 Construct Features 来检查图中有无多余的线段和点与线分离的过远,...execl点数据转arcgis点、... 6页 免费
ArcGIS问题:获取polygo... 2页 免费...
教案-4.5最基本的图形-点与线(1)_数学_初中教育_教育专区。4.5 最基本的图形---点和线备课人:周群芳 【课标要求】 :让学生理解点、直线、射线、线段等简单...
点与线点:表示一个物体的位置。表示法:用一个大写字母表示点,如点 A. 直线...线段的基本性质:在所有连接两点的线中,线段的长度最短.即两点之间,线段最短。...ArcGIS API for Silverlight 使用GeometryService求解线与面的交点(一) - 推酷
ArcGIS API for Silverlight 使用GeometryService求解线与面的交点(一)
最近在做项目的时候遇到一个问题,大致情况如下:
已知河流的面要素,需要根据用户输入的矩形以及设定的步长对河流进行网格划分,并得到网格与两边河岸的交点。
查了查资料,发现原生的ArcGIS API for Silverlight并没有提供实现该功能的借口,但是GeometryService提供了一个类似的功能:Intersect.
Intersect:其相交的情况有如下三种:
这里需要注意的时最后一个:线与线相交,从几何的角度来说,最后得到的结果应该是一个点,然而在GeometryService中,最后得到的结果是PolyLine,即是线,而且该线的Extent属性为null,也就是说线段长度为0.因此如果你想通过Intersect来求解两条线的交点实不可取的。那么这里的用处是什么呢?就是可以用来判断交点的个数。
从上图来看我们的情况是属于第二种:即面与线相交。
但是我们发现,这里得到的是相交的线,而我们要的是点,这个该怎么解决呢?
其实我们再一想,就可以发现,既然我们能够得到相交的线,那么我们是不是可以得到线的两个端点呢?如果可以得到两个端点是不是我们的问题就解决了呢?
答案只对了一半,因为我们再仔细一想,又会发现一个问题就是虽然我们可以得到两个端点,但是有的端点并不是网格与河流面要素的交点,例如下图所示:
上图表示对河流进行划分的网格
如果按照上面的思路我们将得到如下的结果:
我们发现,虽然得到了与河流的交点但是左右两侧水平线的端点也包含了进来,而显然它们都不是与河流的交点,那么这里该怎么去除呢?
从上图可以知道,左右边界上非河岸的交点都位于网格的边缘,假设我们设网格矩形的区域为(Xmin,Ymin,Xmax,Ymax),则这些点的X坐标都为Xmin或者Xmax,所以我们由此可以去除边界上的点,然而这里有一个问题是:
当我们按照一定的步长划分时,不一定会整分,即出现如下的情况:
我们发现上面和右边并不是刚好等分的,上面和右面部分线条超出了“范围”,虽然这并不影响河流的交点的提取,但是多少显得不那么好看。
下面我们先看看构造网格的代码:
public void CreateGrid(double xMin,double xMax,double yMin,double yMax,double xstep,double ystep)
//定义两个Point,确定一条直线
MapPoint mp1;
MapPoint mp2;
//由步长确定划分成多少份
int Nx = Convert.ToInt32((xMax - xMin)/xstep);
int Ny = Convert.ToInt32((yMax - yMin) / ystep);
//构造竖直方向的线
for (int i = 0; i &Nx+1; i++)
mp1=CreateMapPoint(xMin+i*xstep, yMin);
mp2=CreateMapPoint(xMin + i * xstep,yMax);
CreateLine(mp1, mp2);
//构造水平方向的线
for (int i = 0; i & Ny+1; i++)
mp1 = CreateMapPoint(xMin, yMin +i * ystep);
mp2 = CreateMapPoint(xMax, yMin + i * ystep);
CreateLine(mp1, mp2);
//RectExtent为自定义的一种结构体,存储每一次网格划分时的矩形范围
recExtent = new RectExtent()
Xmin = Convert.ToDouble((xMin).ToString(&#0.000&)),
Xmax = Convert.ToDouble((xMin + Nx * xstep).ToString(&#0.000&)),
Ymin = Convert.ToDouble((yMin).ToString(&#0.000&)),
Ymax = Convert.ToDouble((yMin + Ny * ystep).ToString(&#0.000&))
以上的CreateMapPoint为自定义方法,表示根据X,Y坐标,新建一个点(MapPoint),示例代码如下:
public MapPoint CreateMapPoint(double x,double y)
return new MapPoint(x, y);
CreateLine表示根据得到的两个点,绘制一条直线:
public void CreateLine(MapPoint p1,MapPoint p2)
ESRI.ArcGIS.Client.Geometry.Polyline polyline = new ESRI.ArcGIS.Client.Geometry.Polyline();
ESRI.ArcGIS.Client.Geometry.PointCollection pc=new ESRI.ArcGIS.Client.Geometry.PointCollection ();
pc.Add(p1);
pc.Add(p2);
polyline.Paths.Add(pc);
//记得对空间坐标系赋值,否则Simplify会出错。
polyline.SpatialReference = map1.SpatialR
AddLineGraphic(polyline);
AddLineGraphic表示将生成的线添加到图层中:
public void AddLineGraphic(ESRI.ArcGIS.Client.Geometry.Polyline polyline)
Graphic g = new Graphic()
Geometry = polyline,
Symbol = LayoutRoot.Resources[&LineSymbol&] as SimpleLineSymbol
glayer.Graphics.Add(g);
同理,之后的AddPointGraphic即向图层中添加点:
public void AddPointGraphic(ESRI.ArcGIS.Client.Geometry.MapPoint point)
Graphic g = new Graphic()
Geometry = point,
Symbol = LayoutRoot.Resources[&PointSymbol&] as SimpleMarkerSymbol,
glayer.Graphics.Add(g);
这里我们实现了网格的绘制,但是你会发现得到的网格如本文第3张图片所示。
这并不是我们所希望的,这里我们修改一下构造水平和垂直直线的代码,如下所示:
//构造竖直方向的线
for (int i = 0; i &Nx+1; i++)
mp1=CreateMapPoint(xMin+i*xstep, yMin);
//mp2=CreateMapPoint(xMin + i * xstep,yMax);
mp2 = CreateMapPoint(xMin + i * xstep, yMin + Ny * ystep);
CreateLine(mp1, mp2);
//构造水平方向的线
for (int i = 0; i & Ny+1; i++)
mp1 = CreateMapPoint(xMin, yMin +i * ystep);
mp2 = CreateMapPoint(xMin + Nx * xstep, yMin + i * ystep);
//mp2 = CreateMapPoint(xMax, yMin + i * ystep);
CreateLine(mp1, mp2);
这里我们将Xmax改成了Xmax+Nx*Xstep,同理其他。
这样我们就能得到闭合的网格了。
但是我们还是没有说如何解决上面说的那个问题,上面我们说到通过Xmin和Xmax来判断是否是河流的交点,但是实际运行程序时,是无法实现的,为什么呢?
因为我们再使用Geometry的Intersect时,再Intersect的过程中对每一个点(交线的端点)的坐标值都会进行相应的简化(四舍五入),这样我们在Intersect完成事件函数中获得端点值就已经不等于Intersect之前的了,因此也就无法根据线段端点的Xmin和Xmax值是否等于边界值来取舍交点。
具体过程可以看下面的示意图:
因此,通过Xmin和Xmax的方式也不行。那到底该怎么办呢?
这里我们仔细一想就会发现,Intersect之后的Xmin和Xmax和实际上的X范围很相近,因为Intersect实际上就是对X范围进行了四舍五入。
而一般来说Intersect之后的的X范围和初始时的X范围相差不超过1.甚至是0.1。于是我们将Intersect之后的值与初始时的值做作差取绝对值,这样就可以确定Intersect之后,线段的端点是不是交点了。
下面给出GeometryService的Intersect完成事件处理函数的代码:
void geometryService_IntersectCompleted(object sender, GraphicsEventArgs e)
glayer.Graphics.Clear();
foreach (Graphic g in e.Results)
g.Symbol = LayoutRoot.Resources[&ResultsLineSymbol&] as SimpleLineS
if (g.Geometry.Extent != null)
#region 垂直线
if (g.Geometry.Extent.Width == 0.0)//垂直线两个端点即为交点
foreach (ESRI.ArcGIS.Client.Geometry.PointCollection pc in (g.Geometry as ESRI.ArcGIS.Client.Geometry.Polyline).Paths)
foreach (MapPoint mp in pc)
if (Math.Abs(mp.Y - recExtent.Ymin) & 0.1 ||
Math.Abs(mp.Y - recExtent.Ymax) & 0.1)
AddPointGraphic(mp);
#endregion
#region 水平线
if (g.Geometry.Extent.Height == 0.0)
foreach (ESRI.ArcGIS.Client.Geometry.PointCollection pc in (g.Geometry as ESRI.ArcGIS.Client.Geometry.Polyline).Paths)
foreach (MapPoint mp in pc)
if (Math.Abs(mp.X - recExtent.Xmin) & 0.1 ||
Math.Abs(mp.X - recExtent.Xmax) & 0.1)
AddPointGraphic(mp);
#endregion
glayer.Graphics.Add(g);
这里我们将边界点的值与交线的端点值比较,如果两者之差小于0.1,则表示该点为边界点,舍去
以上解释了实现过程中的关键部分,接下来看看具体实现的流程:
(1):绘制矩形,网格划分
自定义结构体:
public struct RectExtent
public double X
public double Y
public double X
public double Y
声明如下变量:
//定义绘制矩形的画笔
private Draw drawRect =
//定义集合服务变量
private GeometryService geometryService =
//用来承载绘制的线和点
GraphicsLayer glayer =
//河流要素
FeatureLayer fpolygonlayer =
//自定义结构体变量
private RectExtent recE
在构造函数中实例化:
public MainPage()
InitializeComponent();
geometryService = new GeometryService(&http://qzj-pc/ArcGIS/rest/services/Geometry/GeometryServer&);
geometryService.IntersectCompleted += new EventHandler&GraphicsEventArgs&(geometryService_IntersectCompleted);
geometryService.SimplifyCompleted += new EventHandler&GraphicsEventArgs&(geometryService_SimplifyCompleted);
geometryService.Failed += new EventHandler&TaskFailedEventArgs&(geometryService_Failed);
glayer=map1.Layers[&LineLayer&] as GraphicsL
fpolygonlayer = map1.Layers[&RiverPolygon&] as FeatureL
drawGridButton.Click += new RoutedEventHandler(drawGridButton_Click);
intersectButton.Click += new RoutedEventHandler(intersectButton_Click);
ClearButton.Click += new RoutedEventHandler(ClearButton_Click);
drawRect = new Draw(map1);
drawRect.DrawMode = DrawMode.R
drawRect.DrawComplete += new EventHandler&DrawEventArgs&(drawRect_DrawComplete);
drawRect.IsEnabled =
点击绘制要输Button,绘制网格
void drawGridButton_Click(object sender, RoutedEventArgs e)
//确定用户输入了步长信息
if (xStepTextBox.Text.Trim() == && || yStepTextBox.Text.Trim() == &&)
MessageBox.Show(&请输入步长信息&);
drawRect.IsEnabled =
void drawRect_DrawComplete(object sender, DrawEventArgs e)
drawRect.IsEnabled =
CreateGrid(e.Geometry.Extent.XMin, e.Geometry.Extent.XMax, e.Geometry.Extent.YMin, e.Geometry.Extent.YMax, Convert.ToDouble(xStepTextBox.Text), Convert.ToDouble(yStepTextBox.Text));
CreateGrid在上面已经给出,在此不再说明。
(2)Silmplify河流要素
void intersectButton_Click(object sender, RoutedEventArgs e)
geometryService.SimplifyAsync(fpolygonlayer.Graphics);
(3)在Simplify事件完成函数中进行Intersect操作。
由于这里使用的河流要素只有一个图层所以生成的结果Results只有一个要素,即索引值为0.
void geometryService_SimplifyCompleted(object sender, GraphicsEventArgs e)
geometryService.IntersectAsync(glayer.Graphics, e.Results[0].Geometry);
(4).在Intersect事件完成函数中筛选正确的交点,代码上面已经给出,在此不在说明。
(5)最后将正确的点添加到图层中。
最后便可以得到正确的结果:
思考:如何绘制出网格的交点呢?
预告:下一篇将讲解线与线交点的求解,欢迎继续关注!
&(版权所有,转载请标明出处)
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 arcgis 线交点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信