爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
12
返回列表 发新帖
楼主: tinysand

VectorLayer显示不正常的问题

[复制链接]

新浪微博达人勋

 楼主| 发表于 2013-3-8 12:58:18 | 显示全部楼层
试了一个上午,还是不行,将工程的源代码及样例数据传上,麻烦老师看下。

MeteoStudy1.rar

2.25 MB, 阅读权限: 90, 下载次数: 2, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-8 18:30:17 | 显示全部楼层
本帖最后由 tinysand 于 2013-3-8 19:38 编辑

生成的.shp文件可用arcgis打开,但不能显示
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-8 20:10:24 | 显示全部楼层

仔细看了看,你在生成每个PolylineShape时没有给Extent(最大、最小X/Y坐标)赋值,图层的每个图元都应该有自己的Extent,在显示时会根据Extent确定是否在显示范围内从而确定是否绘制该图元。

可以写一个函数遍历PolylineShape的每个点获得该PolylineShape的Extent。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-9 11:13:17 | 显示全部楼层
PolylineShape 的Length属性没有办法修改,保存出来的线还是没有办法在arcgis上显示。另外,是不是有可能PolygonShpe及PointShpe等也还要暴露出来一些属性供修改。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-9 11:26:18 | 显示全部楼层
tinysand 发表于 2013-3-9 11:13
PolylineShape 的Length属性没有办法修改,保存出来的线还是没有办法在arcgis上显示。另外,是不是有可能Po ...

你没看我上面给你回复的帖子吗?要给给每个PolylineShape的Extent赋值,否则Extent的minX, minY, maxX, maxY都是0,显示当然会有问题。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-9 12:40:58 | 显示全部楼层
王老师,按您说的修改了,可以在meteoinfo中正常显示,但不能进行投影变换。保存的文件没有办法在arcgis上显示。

仔细检查,发现是
PolylineShape 的Length属性没有办法修改,new PolylineShape 时也只有默认的构造函数,无法对Length属性进行赋值。这样投影变换时会出出错信息:对象为空。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-9 13:40:55 | 显示全部楼层
tinysand 发表于 2013-3-9 12:40
王老师,按您说的修改了,可以在meteoinfo中正常显示,但不能进行投影变换。保存的文件没有办法在arcgis上显 ...

论坛里有MeteoInfo二次开发的系列教程贴,你先仔细看看。

怎么不能投影?至少要把你是怎么做的,错误现象详细描述一下吧。怎么保存的文件?可以把文件贴出来,在arcgis上显示有什么错误提示?

不要纠缠Legenth属性,那个是只读的,跟你说的问题没有关系。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-9 16:12:52 | 显示全部楼层
本帖最后由 tinysand 于 2013-3-9 16:26 编辑

风沙的星期六,王老师仍在认真的回答我们的问题,谢谢!
生成VectorLayer的代码如下,主程序仍是上次的工程。
  1. /// 生成等值线的shp文件
  2.         /// 生成等值线的shp文件
  3.         ///
  4.         ///
  5.         public void CreateShp(string sShapeFullName)
  6.         {
  7.             string strShapeFolder = System.IO.Path.GetDirectoryName(sShapeFullName);
  8.             string strShapeFile = System.IO.Path.GetFileName(sShapeFullName);

  9.             //New layer
  10.             VectorLayer aLayer = new VectorLayer(ShapeTypes.Polyline);
  11.             aLayer.LayerName = strShapeFile;
  12.             //aLayer.LegendScheme = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Polyline, Color.Red, 2);
  13.             Color[] colors = LegendManage.CreateColors(Color.Blue, Color.Red, _CValues.Count());
  14.             aLayer.LegendScheme = LegendManage.CreateUniqValueLegendScheme(_CValues, colors, ShapeTypes.Polyline
  15.                 , m_fMinData, m_fMaxData, false, -999.0);

  16.             aLayer.LegendScheme.FieldName = "Value";            //Add fields            
  17.             aLayer.EditAddField("Type", typeof(string));
  18.             aLayer.EditAddField("Value", typeof(double));

  19.             //Add shape
  20.             for (int i = 0; i < _contourLines.Count; i++)
  21.             {
  22.                 PolylineShape aPL = new PolylineShape();

  23.                 double fMinX=999, fMaxX = -999, fMinY=999, fMaxY = -999;            //用于计算线的Extent

  24.                 double fLen = 0, fLastX=_contourLines[i].PointList[0].X, fLastY=_contourLines[i].PointList[0].Y;  //用于计算线的Length

  25.                 for (int j = 0; j < _contourLines[i].PointList.Count; j++)
  26.                 {
  27.                     MeteoInfoC.PointD aPoint = new MeteoInfoC.PointD();
  28.                     aPoint.X = _contourLines[i].PointList[j].X;
  29.                     aPoint.Y = _contourLines[i].PointList[j].Y;
  30.                     aPL.Points.Add(aPoint);
  31.                     //计算线的范围
  32.                     if(fMinX > aPoint.X)
  33.                         fMinX = aPoint.X;
  34.                     if(fMinY > aPoint.Y)
  35.                         fMinY = aPoint.Y;
  36.                     if(fMaxX < aPoint.X)
  37.                         fMaxX = aPoint.X;
  38.                     if(fMaxY < aPoint.Y)
  39.                         fMaxY = aPoint.Y;
  40.                     //计算线的长度
  41.                     fLen = fLen + Math.Sqrt((aPoint.X - fLastX)*(aPoint.X - fLastX) +
  42.                         (aPoint.Y - fLastY)*(aPoint.Y - fLastY));
  43.                     fLastX = aPoint.X;
  44.                     fLastY = aPoint.Y;

  45.                 }
  46.                 MeteoInfoC.Global.Extent ext = new MeteoInfoC.Global.Extent(fMinX, fMaxX, fMinY, fMaxY);
  47.                 aPL.Extent = ext;
  48.                 aPL.value = _contourLines[i].Value;

  49.                 int shapeNum = aLayer.ShapeNum;
  50.                 if (aLayer.EditAddShape(aPL))
  51.                 {
  52.                     //Edit record value
  53.                     aLayer.EditCellValue("Type", shapeNum, _contourLines[i].Type);
  54.                     aLayer.EditCellValue("Value", shapeNum, _contourLines[i].Value);
  55.                 }
  56.             }
  57.             MeteoInfoC.Global.Extent extent = new MeteoInfoC.Global.Extent(m_fLBLon, m_fRTLon, m_fLBLat, m_fRTLat);
  58.             aLayer.Extent = extent;
  59.             aLayer.ProjInfo = m_MainMapView.ActiveMapFrame.MapView.Layers[1].ProjInfo;
  60.             //aLayer.ProjInfo
  61.             m_MainMapView.ActiveMapFrame.AddLayer(aLayer);
  62.             

  63.         }
复制代码


用这个加入代码VectorLayer在投影为lambert投影时,会出现异常。图片
Snap2.jpg

VS中的详细异常信息如下:
未处理 System.NullReferenceException
  Message="未将对象引用设置到对象的实例。"
  Source="MeteoInfoC"
  StackTrace:
       在 MeteoInfoC.Geoprocess.GeoComputation.(List`1 , Object )
       在 MeteoInfoC.Geoprocess.GeoComputation.ClipPolylineShape_Lon(PolylineShape aPLS, Double lon)
       在 MeteoInfoC.Map.ProjectionSet.ProjectLayer(VectorLayer oLayer, ProjectionInfo toProj, Boolean projectLabels)
       在 MeteoInfoC.Map.ProjectionSet.ProjectLayer(VectorLayer oLayer, ProjectionInfo toProj)
       在 MeteoInfoC.Map.ProjectionSet.ProjectLayers(MapView aMapView, ProjectionInfo toProj)
       在 MeteoInfoC.Map.MapView.ProjectLayers(ProjectionInfo toProj)
       在 MeteoTest.MainFrm.buttonItemLambert_Click(Object sender, EventArgs e) 位置 E:\meteoinfoStudy\MeteoShow\MeteoShow\MainFrm.cs:行号 243
       在 DevComponents.DotNetBar.BaseItem.RaiseClick(eEventSource source)
       在 DevComponents.DotNetBar.BaseItem.InternalMouseUp(MouseEventArgs objArg)
       在 DevComponents.DotNetBar.PopupItem.InternalMouseUp(MouseEventArgs objArg)
       在 DevComponents.DotNetBar.ButtonItem.InternalMouseUp(MouseEventArgs objArg)
       在 DevComponents.DotNetBar.BaseItem.InternalMouseUp(MouseEventArgs objArg)
       在 DevComponents.DotNetBar.GenericItemContainer.InternalMouseUp(MouseEventArgs objArg)
       在 DevComponents.DotNetBar.Bar.OnMouseUp(MouseEventArgs e)
       在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       在 System.Windows.Forms.Control.WndProc(Message& m)
       在 DevComponents.DotNetBar.Bar.WndProc(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.Run(Form mainForm)
       在 MeteoShow.Program.Main() 位置 E:\start\meteoinfoStudy\MeteoShow\MeteoShow\Program.cs:行号 18
       在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       在 System.Threading.ThreadHelper.ThreadStart()
  InnerException:



调试时我仔细的对比了自己生成的VectorLayer和王老师示例代码的river.shp生成的VectorLayer对象的值,好象就是缺Lenght值的原因。

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-9 20:04:46 | 显示全部楼层
tinysand 发表于 2013-3-9 16:12
风沙的星期六,王老师仍在认真的回答我们的问题,谢谢!
生成VectorLayer的代码如下,主程序仍是上次的工程 ...

还是生成图层的问题,在生成图层的函数中用下面一段代码:
//Add shape
            for (int i = 0; i < _contourLines.Count; i++)
            {
                PolylineShape aPL = new PolylineShape();
                List<MeteoInfoC.PointD> pList = new List<MeteoInfoC.PointD>();
                for (int j = 0; j < _contourLines.PointList.Count; j++)
                {
                    MeteoInfoC.PointD aPoint = new MeteoInfoC.PointD();
                    aPoint.X = _contourLines.PointList[j].X;
                    aPoint.Y = _contourLines.PointList[j].Y;
                    pList.Add(aPoint);
                }
                aPL.Points = pList;
                aPL.numPoints = pList.Count;
                int shapeNum = aLayer.ShapeNum;
                if (aLayer.EditAddShape(aPL))
                {
                    //Edit record value
                    aLayer.EditCellValue("Type", shapeNum, _contourLines.Type);
                    aLayer.EditCellValue("Value", shapeNum, _contourLines.Value);
                }
            }


然后就应该可以了。
Image00355.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-9 21:29:25 | 显示全部楼层
果然可以了,使用地道的方法就是不一样。这样每一个PolyLineShpe对象的属性都自动生成对了,包括范围之类的,代码量还小。谢谢王老师。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表