arcengine 开发问题 点批量移动到线上

问题描述

算法的思路是按照下面的帖子中来的:http://www.cnblogs.com/gisoracle/archive/2013/04/09/3009285.html线数据是从"主要铁路.shp"文件中读入的,从另外一个pointshapefile.shp文件读入一些目标点数据,然后想找出铁路线上离目标点最近的点。如图,读入和显示都没问题。程序如下usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingESRI.ArcGIS.esriSystem;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geometry;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.SystemUI;usingESRI.ArcGIS.DataSourcesFile;usingESRI.ArcGIS.Geodatabase;namespaceArcObject{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton_MovePoint_Click(objectsender,EventArgse){//查询缓冲区图层IFeatureLayerptLayer=queryFeatureLayer("pointshapefile");//得到指定图层上距point最近的feature上的最近点IFeatureClassptFeatClass=ptLayer.FeatureClass;IFeatureCursorfeatureCursor=ptFeatClass.Search(null,false);IFeaturefeature=featureCursor.NextFeature();//IPointpoint=newPointClass();IPointpoint=newPointClass();while(feature!=null){point=feature.ShapeasIPoint;//查找离点最近的线IFeaturenearFea=GetNearestFeature(point,1.2);IPointneaPoint=GetNearestPoint(point,nearFea);neaPoint.Z=point.Z;//移动点MoveToNeaPoint(feature,point,neaPoint);if(featureCursor==null||feature==null){return;}feature=featureCursor.NextFeature();}MessageBox.Show("ok--");}////得到指定图层上距point最近的feature上的最近点publicIPointGetNearestPoint(IPointpoint,IFeaturenearFea){IProximityOperatorProximity=(IProximityOperator)point;IFeatureLayerFeaLyr=queryFeatureLayer("主要铁路");IFeatureClassFeaCls=FeaLyr.FeatureClass;IQueryFilterqueryFilter=null;ITopologicalOperatortopoOper=(ITopologicalOperator)point;IGeometrygeo=topoOper.Buffer(1.2);ISpatialFiltersf=newSpatialFilter();sf.Geometry=geo;sf.GeometryField=FeaCls.ShapeFieldName;sf.SpatialRel=esriSpatialRelEnum.esriSpatialRelCrosses;IFeatureCursorFeaCur=FeaCls.Search(queryFilter,false);IFeatureFea=nearFea=FeaCur.NextFeature();doubleminDistince,Distance;if(Fea==null)returnnull;minDistince=Distance=Proximity.ReturnDistance((IGeometry)Fea.Shape);//最近的距离值//保存距离最近的featureFea=FeaCur.NextFeature();while(Fea!=null){Distance=Proximity.ReturnDistance((IGeometry)Fea.Shape);if(Distance<minDistince){minDistince=Distance;nearFea=Fea;}Fea=FeaCur.NextFeature();}//endwhileProximity=(IProximityOperator)nearFea.Shape;returnProximity.ReturnNearestPoint(point,esriSegmentExtension.esriNoExtension);}publicIFeatureGetNearestFeature(IPointp,doublerongcha){IFeaturenearFea;IProximityOperatorProximity=(IProximityOperator)p;IFeatureLayerFeaLyr=queryFeatureLayer("主要铁路");IFeatureClassFeaCls=FeaLyr.FeatureClass;IQueryFilterqueryFilter=null;IFeatureCursorFeaCur=FeaCls.Search(queryFilter,false);IFeatureFea=nearFea=FeaCur.NextFeature();doubleminDistince,Distance;if(Fea==null)returnnull;Distance=Proximity.ReturnDistance((IGeometry)pline);//最近的距离值minDistince=Distance;//保存距离最近的featureFea=FeaCur.NextFeature();while(Fea!=null){Distance=Proximity.ReturnDistance((IGeometry)Fea.Shape);if(Distance<minDistince){minDistince=Distance;nearFea=Fea;}Fea=FeaCur.NextFeature();}//endwhilereturnnearFea;}privatevoidMoveToNeaPoint(IFeaturefeature,IPointpoint,IPointneaPoint){//IGeometrytoGeometry=null;//IPointgeomType=newPointClass();IPointgeomType=newPointClass();feature.Shape=neaPointasIGeometry;feature.Store();}//查询给定名称的图层privateIFeatureLayerqueryFeatureLayer(stringname){//axMapControl1.AddShapeFile();for(inti=0;i<axMapControl1.LayerCount;i++){ILayerlayer=axMapControl1.get_Layer(i);stringnname=layer.Name;if(layer.Name.Equals(name)){return(IFeatureLayer)layer;}}returnnull;}privatevoidInput_Click(objectsender,EventArgse){AddShapefileUsingOpenFileDialog(this.axMapControl1.ActiveView);}publicvoidAddShapefileUsingOpenFileDialog(ESRI.ArcGIS.Carto.IActiveViewactiveView){//parametercheckif(activeView==null){return;}//UsetheOpenFileDialogClasstochoosewhichshapefiletoload.System.Windows.Forms.OpenFileDialogopenFileDialog=newSystem.Windows.Forms.OpenFileDialog();//openFileDialog.InitialDirectory="c:\";openFileDialog.InitialDirectory="D:\data";//openFileDialog.InitialDirectory="D:\data";openFileDialog.Filter="Shapefiles(*.shp)|*.shp";openFileDialog.FilterIndex=2;openFileDialog.RestoreDirectory=true;openFileDialog.Multiselect=false;if(openFileDialog.ShowDialog()==System.Windows.Forms.DialogResult.OK){//Theuserchoseaparticularshapefile.//Thereturnedstringwillbethefullpath,//filenameandfile-extensionforthechosenshapefile.//Example:"C:testcities.shp"stringshapefileLocation=openFileDialog.FileName;if(shapefileLocation!=""){//Ensuretheuserchoosesashapefile//CreateanewShapefileWorkspaceFactoryCoClasstocreateanewworkspaceIWorkspaceFactoryworkspaceFactory=newShapefileWorkspaceFactoryClass();//System.IO.Path.GetDirectoryName(shapefileLocation)//returnsthedirectorypartofthestring.Example:"C:test"stringdir=System.IO.Path.GetDirectoryName(shapefileLocation);workspaceFactory.OpenFromFile(dir,0);IFeatureWorkspacefeatureWorkspace=(ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspaceFactory.OpenFromFile(dir,0);ESRI.ArcGIS.Geodatabase.IFeatureClassfeatureClass=featureWorkspace.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(shapefileLocation));ESRI.ArcGIS.Carto.IFeatureLayerfeatureLayer=newESRI.ArcGIS.Carto.FeatureLayerClass();featureLayer.FeatureClass=featureClass;featureLayer.Name=featureClass.AliasName;featureLayer.Visible=true;activeView.FocusMap.AddLayer(featureLayer);//ZoomthedisplaytothefullextentofalllayersinthemapactiveView.Extent=activeView.FullExtent;activeView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeography,null,null);}else{//Theuserdidnotchooseashapefile.//DowhateverremedialactionsasnecessarySystem.Windows.Forms.MessageBox.Show("Noshapefilechosen");//System.Windows.Forms.MessageBoxButtons.OK,//System.Windows.Forms.MessageBoxIcon.Exclamation);}}}}}

函数publicIPointGetNearestPoint(IPointpoint,IFeaturenearFea)中下面这一句抛出异常,目的是计算距离Distance=Proximity.ReturnDistance((IGeometry)Fea.Shape);我试着把Fea.Shape转换为IGeometryCollection也抛出异常IPolylinepltmp=newPolylineClass();IGeometryCollectiontmpColl=(IGeometryCollection)pltmp;tmpColl.AddGeometry((IGeometry)Fea.Shape);IPolylinepline=(IPolyline)tmpColl;刚接触这方面编程,查了些文档也没弄明白,请各位指教!

解决方案

本帖最后由 jiangyangdadao 于 2015-10-07 19:49:39 编辑
解决方案二:
给文件名就可以了

时间: 2024-09-13 14:00:29

arcengine 开发问题 点批量移动到线上的相关文章

arc engine-arcengine二次开发中怎样找到两个点的中点且该点在某条线上?

问题描述 arcengine二次开发中怎样找到两个点的中点且该点在某条线上? 例如:有两个IPoint: pPoint1和pPoint2,一个IPolyline: pLine,想求出这两个IPoint的中点且该中点在线pLine上.代码怎么写?

IC乐购商城-小批量电子元器件线上采购网在B2C的蓝海战略

努力总有回报.2011年,我们的电子元器件线上交易销售额增长了14%,超过了同年销售额的整体增长率,如此快速的发展主要归功于电子商务.IC乐购创始人兼CEO 吕新桥互联网时代的到来颠覆了传统的商业模式,电子商务已经成为当下企业销售产品和推广品牌的重要途径, 正以"摧枯拉朽"之势击荡着整个世界的商业轨迹.如今,电商模式已经蔓延到电子元器件分销领域,可近两年,受全球经济危机的影响,电子元器件需求下挫.面对颓势,IC乐购-元器件线上采购网绝不等闲视之,而是全力应对,勇往直前,努力在"

如何从开发环境直连线上(IPTables)

假如你在生产环境有一个内网可访问的端口,Let's say: 80,而且有生产机器的应用管理员权限.在这样的情况下,其实是可以做到从内网直接连接到线上环境任意端口的.链接SSH,链接数据库都不在话下.当然,安全性和便利性永远是不可调和的一对矛盾.为了避免有人用它来干坏事,我们也至少应当对这种方式有所了解. x00 环境描述 假设有生产环境机器10.x.x.1.可在内网通过VIP:123.123.123.1访问80端口. 坏蛋拥有线上环境sudo权限,现在希望在生产环境中直接访问任意端口. x01

适应各种开发,测试,线上,线下环境的Spring配置方式

背景 假设开发了一个中间件,比如是一个缓存系统,这个中间件要配置一个IP地址,还要配置一个Factory,从这个Factory里得到一个client,如: <bean name="cacheFactory" class="com.test.cache.Factory"> <property name="address" value="192.168.1.100"/> </bean> <

前端开发调试线上代码的两款工具

原文:前端开发调试线上代码的两款工具 用过 Charles 和 Fiddler 这两款,记录如下.   一.Charles Charles 界面简单直观,易于上手,数据请求控制容易,修改也简单,抓取数据的开始暂停也方便.全平台支持 win,mac,linux.   1. 安装前提Charles 需要有 Java 环境,请提前下载安装 JDK.JDK 已经 8 了. 根据自己的系统选择对应的JDK.我的是 win7,双击安装,一直下一步就哦了.在命令行窗口输入以下命令,出现截图所示就表示 JDK

速卖通国上线批量线上发货功能,简化卖家操作流程

1月14日消息,日前,阿里巴巴旗下外贸电商平台全球速卖通开通了国际E邮宝的批量线上发货功能,将简化卖家的操作流程,加快订单处理速度. 自从各路邮政涨价后,国际E邮宝的价格优势和时效优势逐渐突显出来,所以速卖通平台E邮宝的使用量越来越大.但是,此前在订单操作上只能单笔创建,且每次都要输入发货人信息,给卖家带来了一定的不便. 速卖通表示,根据广大卖家的反应,平台对线上发货功能做了调整,正式推出批量线上发货工具. E邮宝新增批量上线发货功能 在操作上,卖家首先将使用E邮宝发货的订单导出到Excel,然

大家觉得是本机开发好,还是线上开发好?

问题描述 看微软CRM模版大赛的官方网站,现在貌似已经有不少大虾参加了.经本人研究发现,此次大赛给大家提供了两种开发方式:一种是线上方式,即登陆风云平台,在网络的"沙箱"环境中进行代码编写,模版设计:另一种就是下载CRM官方虚拟机或者自行安装CRM开发环境,以此来进行CRM开发.感觉上,这两种方式各有优点,前者占用电脑资源小,对电脑配置要求低,对于一些小试身手却电脑配置一般的小虾很有吸引力:而后者呢,长处也挺明显,一来可以使开发者不受网络条件限制,随时可以工作,此外,似乎也方便模板导入

亚洲MTV 公司将开发全球首款《海绵宝宝》多人线上游戏

新加坡/香港/首尔/东京/纽约2010年6月9日讯 –隶属于纽约证交所上市公司Viacom Inc (NYSE:VIA, VIA.B)的亚洲MTV Networks公司 ,今日宣告与亚洲线上游戏领导者和信超媒体股份有限公司(GigaMedia Limited ,NASDAQ: GIGM)共同开发并共同发行全球首款<海绵宝宝>(SpongeBob SquarePants)多人线上游戏 (MMOG,Massively Multiplayer Online Game) .<海绵宝宝>是N

IC乐购-元器件线上采购网积极寻求策略与转型

努力总有回报.2011年,我们的电子元器件线上交易销售额增长了14%,超过了同年销售额的整体增长率,如此快速的发展主要归功于电子商务.IC乐购创始人兼CEO 吕新桥互联网时代的到来颠覆了传统的商业模式,电子商务已经成为当下企业销售产品和推广品牌的重要途径, 正以"摧枯拉朽"之势击荡着整个世界的商业轨迹.如今,电商模式已经蔓延到电子元器件分销领域,可近两年,受全球经济危机的影响,电子元器件需求下挫.面对颓势,IC乐购-元器件线上采购网绝不等闲视之,而是全力应对,勇往直前,努力在"