C#开发ArcGIS Engine根据坐标提取对应区的属性
我是C#开发ArcGISEngine的初学者,想实现这样一个功能:现在通过程序打开了一张具有坐标的地图(区文件),也就是说每个区里面有各自的属性,现在我想根据一个点的坐标...
我是C#开发ArcGIS Engine的初学者,想实现这样一个功能:现在通过程序打开了一张具有坐标的地图(区文件),也就是说每个区里面有各自的属性,现在我想根据一个点的坐标来提取它对应区的属性,也就是说:输入一个点坐标怎么能够读取到该点对应位置的这个区的属性呢?就像相交分析一样。刚学ArcGIS Engine开发不久,请各位大侠赐教呀,给个方法或者程序的,谢谢!
展开
5个回答
展开全部
在AE中这叫点选查询,其中你可以用你自己的坐标来替换 下面的
IMap pMap = axMapControl1.Map;
IActiveView pActiveView = pMap as IActiveView;
IFeatureLayer pFeatureLayer = pMap.get_Layer(0) as IFeatureLayer;
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
//设置点击点的位置
IPoint point = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
ITopologicalOperator pTOpo = point as ITopologicalOperator;
double length;
length = ConvertPixelsToMapUnits(pActiveView, 4);
IGeometry pBuffer = pTOpo.Buffer(length);
IGeometry pGeomentry = pBuffer.Envelope;
//空间滤过器
ISpatialFilter pSpatialFilter = new SpatialFilter();
pSpatialFilter.Geometry = pGeomentry;
//根据被选择要素的不同,设置不同的空间滤过关系
switch (pFeatureClass.ShapeType)
{
case esriGeometryType.esriGeometryPoint:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
break;
case esriGeometryType.esriGeometryPolyline:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
break;
case esriGeometryType.esriGeometryPolygon:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
}
IFeatureSelection pFSelection = pFeatureLayer as IFeatureSelection;
pFSelection.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
ISelectionSet pSelectionset = pFSelection.SelectionSet;
ICursor pCursor;
pSelectionset.Search(null, true, out pCursor);
IFeatureCursor pFeatCursor = pCursor as IFeatureCursor;
IFeature pFeature = pFeatCursor.NextFeature();
while (pFeature != null)
{
pMap.SelectFeature(pFeatureLayer, pFeature);
pFeature = pFeatCursor.NextFeature();
pFeture.get_value("");//在这里你可以写上想要获取的属性的字段
}
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphicSelection, null, null);
上述的自定义函数是将距离的转换
private double ConvertPixelsToMapUnits(IActiveView pActiveView, double pixelUnits)
{
// Uses the ratio of the size of the map in pixels to map units to do the conversion
IPoint p1 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperLeft;
IPoint p2 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperRight;
int x1, x2, y1, y2;
pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out x1, out y1);
pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p2, out x2, out y2);
double pixelExtent = x2 - x1;
double realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;
double sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;
return pixelUnits * sizeOfOnePixel;
}
IMap pMap = axMapControl1.Map;
IActiveView pActiveView = pMap as IActiveView;
IFeatureLayer pFeatureLayer = pMap.get_Layer(0) as IFeatureLayer;
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
//设置点击点的位置
IPoint point = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
ITopologicalOperator pTOpo = point as ITopologicalOperator;
double length;
length = ConvertPixelsToMapUnits(pActiveView, 4);
IGeometry pBuffer = pTOpo.Buffer(length);
IGeometry pGeomentry = pBuffer.Envelope;
//空间滤过器
ISpatialFilter pSpatialFilter = new SpatialFilter();
pSpatialFilter.Geometry = pGeomentry;
//根据被选择要素的不同,设置不同的空间滤过关系
switch (pFeatureClass.ShapeType)
{
case esriGeometryType.esriGeometryPoint:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
break;
case esriGeometryType.esriGeometryPolyline:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
break;
case esriGeometryType.esriGeometryPolygon:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
}
IFeatureSelection pFSelection = pFeatureLayer as IFeatureSelection;
pFSelection.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
ISelectionSet pSelectionset = pFSelection.SelectionSet;
ICursor pCursor;
pSelectionset.Search(null, true, out pCursor);
IFeatureCursor pFeatCursor = pCursor as IFeatureCursor;
IFeature pFeature = pFeatCursor.NextFeature();
while (pFeature != null)
{
pMap.SelectFeature(pFeatureLayer, pFeature);
pFeature = pFeatCursor.NextFeature();
pFeture.get_value("");//在这里你可以写上想要获取的属性的字段
}
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphicSelection, null, null);
上述的自定义函数是将距离的转换
private double ConvertPixelsToMapUnits(IActiveView pActiveView, double pixelUnits)
{
// Uses the ratio of the size of the map in pixels to map units to do the conversion
IPoint p1 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperLeft;
IPoint p2 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperRight;
int x1, x2, y1, y2;
pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out x1, out y1);
pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p2, out x2, out y2);
double pixelExtent = x2 - x1;
double realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;
double sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;
return pixelUnits * sizeOfOnePixel;
}
展开全部
这是c#中的“属性”
假如某个类中有一个成员变量(字段),一般是不允许外部访问的,为了安全性
如果要访问它,必须通过“属性”来访问,例如:
private int Id; //这是一个成员变量,private表示是私有的,外部不可访问
public int ID
{
get { return id; } //当外部访问“属性”ID时,返回id的值
set { id = value; } //当外部为“属性”ID赋值时,将id赋值为value,value就是外部为“属性”ID所赋的值
}
PS:你可以在set和get中写一些隐藏的逻辑来控制这个访问和赋值的过程,这对外部是不可见的
比如
set {
if(value==0)
id = 1;
else
id=value;
}
这样当外部将ID赋值为0时,id里的值实际上是1 8
假如某个类中有一个成员变量(字段),一般是不允许外部访问的,为了安全性
如果要访问它,必须通过“属性”来访问,例如:
private int Id; //这是一个成员变量,private表示是私有的,外部不可访问
public int ID
{
get { return id; } //当外部访问“属性”ID时,返回id的值
set { id = value; } //当外部为“属性”ID赋值时,将id赋值为value,value就是外部为“属性”ID所赋的值
}
PS:你可以在set和get中写一些隐藏的逻辑来控制这个访问和赋值的过程,这对外部是不可见的
比如
set {
if(value==0)
id = 1;
else
id=value;
}
这样当外部将ID赋值为0时,id里的值实际上是1 8
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果是地图 区的定义应该是长方的吧。
判断一个点是否在一个长方形中,这个函数很容易写。X1<x<X2,Y1<y<y2
Draw2d也有区域之间相交计算的函数。不过你这个是点跟区域的交
不知你这个区域怎么定的,如果是自定的多边形,可以用给的函数算,也可以自己写一个划分三角形然后分别判断的。
判断一个点是否在一个长方形中,这个函数很容易写。X1<x<X2,Y1<y<y2
Draw2d也有区域之间相交计算的函数。不过你这个是点跟区域的交
不知你这个区域怎么定的,如果是自定的多边形,可以用给的函数算,也可以自己写一个划分三角形然后分别判断的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以的 方法是便利坐标点,利用每个点再区域里面搜包含的,然后读取属性 不是很难
更多追问追答
追问
谢谢您,能不能详细给个方法啊?你说的我不太明白,便利还是遍历?遍历什么坐标点啊????再劳驾帮帮忙吧
追答
噢 知道了 你自己懂一点么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-07-20
展开全部
不能
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询