Geometry 對象淺析_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:再議ASP.NET DataGrid控件中的“添加新行”功能
        說起在DataGrid中添加新行,ASP.NET開發的大牛人物:Dino Esposito,他的《構建WEB解決方案--應用ASP.NET和ADO.NET》一書中提供了和以上兩位類似的方法,但是Dino又加了些功能,首先就是&rd

        ArcEngine Geometry庫定義了基本幾何圖形的矢量表達形式,頂級的幾何圖形有Points、Multipoints、Polylines、Polygons、 Multipatches,Geodatabase和繪圖系統使用這些幾何圖形來定義其他各種形狀的特征和圖形,提供了編輯圖形的操作方法和地圖符號系統符號化特征數據的途徑。


        Geometry庫中幾個核心類和接口構成了Geometry對象的基本框架。


        GeometryEnvironment


        GeometryEnvironment提供了從不同的輸入、設置或獲取全局變量來創建幾何圖形的方法,以便控制geometry方法的行為。GeometryEnvironment對象是一個單例對象。

      以下為引用的內容:
      public IPolyline TestGeometryEnvironment()
      {
      ISpatialReferenceFactory spatialReferenceFactory
      = new SpatialReferenceEnvironmentClass();

      //Create a projected coordinate system and define its domain, resolution, and x,y tolerance.
      ISpatialReferenceResolution spatialReferenceResolution = spatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_NAD1983UTM_11N) as ISpatialReferenceResolution;
      spatialReferenceResolution.ConstructFromHorizon();
      ISpatialReferenceTolerance spatialReferenceTolerance
      = spatialReferenceResolution as ISpatialReferenceTolerance;
      spatialReferenceTolerance.SetDefaultXYTolerance();
      ISpatialReference spatialReference
      = spatialReferenceResolution as ISpatialReference;

      //Create an array of WKSPoint structures starting in the middle of the x,y domain of the
      //projected coordinate system.

      double xMin;
      double xMax;
      double yMin;
      double yMax;
      spatialReference.GetDomain(
      out xMin, out xMax, out yMin, out yMax);

      double xFactor = (xMin xMax) * 0.5;
      double yFactor = (yMin yMax) * 0.5;

      WKSPoint[] wksPoints
      = new WKSPoint[10];
      for (int i = 0; i < wksPoints.Length; i )
      {
      wksPoints[i].X
      = xFactor i;
      wksPoints[i].Y
      = yFactor i;
      }


      IPointCollection4 pointCollection
      = new PolylineClass();

      IGeometryBridge2 geometryBridge
      = new GeometryEnvironmentClass();
      geometryBridge.AddWKSPoints(pointCollection,
      ref wksPoints);

      IPolyline polyline
      = pointCollection as IPolyline;
      polyline.SpatialReference
      = spatialReference;

      return polyline;
      }

        new GeometryEnvironmentClass僅僅是創建了一個指向已存在的GeometryEnvironmentClass的引用。注意 IGeometryBridge2接口的使用,addWKSPoints方法將WKSPoint二維點添加到PointCollection中,用于構建 path、ring、polyline、polygon,或增加新點到Multipoint、TriangleFan、TriangleStrip。在 Geometry庫中,除了IGeometryBridge2還有IGeometryBridge接口,后者繼承了前者,增加了一些編輯功能(添加點、插入點、重置點、分段等)。


        GeometryBag


        GeometryBag是支持IGeometry接口的幾何對象引用的集合,任何幾何對象都可以通過IGeometryCollection接口添加到 GeometryBag中,但是在使用拓撲操作的時候,需要注意不同類型的幾何類型可能會有相互不兼容的情況。在向GeometryBag中添加幾何對象的時候,GeometryBag對象需要指定空間參考,添加到其中的幾何對象均擁有和GeometryBag對象一樣的空間參考。

      以下為引用的內容:
      private IPolygon GeometryBag_Example(IFeatureClass featureClass)
      {

      //Check input objects.
      if (featureClass == null)
      {
      return null;
      }


      IGeoDataset geoDataset
      = featureClass as IGeoDataset;
      ISpatialFilter queryFilter
      = new SpatialFilterClass();

      //Set the properties of the spatial filter here.
      IGeometry geometryBag = new GeometryBagClass();

      //Define the spatial reference of the bag before adding geometries to it.
      geometryBag.SpatialReference = geoDataset.SpatialReference;

      //Use a nonrecycling cursor so each returned geometry is a separate object.
      IFeatureCursor featureCursor = featureClass.Search(queryFilter, false);

      IGeometryCollection geometryCollection
      = geometryBag as IGeometryCollection;
      IFeature currentFeature
      = featureCursor.NextFeature();

      while (currentFeature != null)
      {
      //Add a reference to this feature's geometry into the bag.
      //You don't specify the before or after geometry (missing),
      //so the currentFeature.Shape IGeometry is added to the end of the geometryCollection.
      object missing = Type.Missing;
      geometryCollection.AddGeometry(currentFeature.Shape,
      ref missing, ref missing);

      currentFeature
      = featureCursor.NextFeature();
      }


      // Create the polygon that will be the union of the features returned from the search cursor.
      // The spatial reference of this feature does not need to be set ahead of time. The
      // ConstructUnion method defines the constructed polygon's spatial reference to be the same as
      // the input geometry bag.
      ITopologicalOperator unionedPolygon = new PolygonClass();
      unionedPolygon.ConstructUnion(geometryBag
      as IEnumGeometry);

      return unionedPolygon as IPolygon;
      }

        Points


        一個點包括X、Y坐標,同時可以增加M、Z值及ID屬性來擴展點的功能。


        Multipoints


        點的集合,多點組成Multipoint幾何類型,使用multipoint對象實現了的IPointCollection接口可以訪問所有的點元素,這些點同樣可以擁有M、Z值及ID屬性來獲得更多的地理空間內涵。


        下面列舉一個例子,通過一個已知的polyline來定義一個新的multipart polyline。

      以下為引用的內容:
      public IPolyline ConstructMultiPartPolyline(IPolyline inputPolyline)
      {
      IGeometry outGeometry
      = new PolylineClass();

      //Always associate new, top-level geometries with an appropriate spatial reference.
      outGeometry.SpatialReference = inputPolyline.SpatialReference;

      IGeometryCollection geometryCollection
      = outGeometry as IGeometryCollection;

      ISegmentCollection segmentCollection
      = inputPolyline as ISegmentCollection;

      //Iterate over existing polyline segments using a segment enumerator.
      IEnumSegment segments = segmentCollection.EnumSegments;

      ISegment currentSegment;
      int partIndex = 0;;
      int segmentIndex = 0;;
      segments.Next(
      out currentSegment,ref partIndex, ref segmentIndex);
      while(currentSegment != null)
      {
      ILine normal
      = new LineClass();

      //Geometry methods with _Query_ in their name expect to modify existing geometries.
      //In this case, the QueryNormal method modifies an existing line
      //segment (normal) to be the normal vector to
      //currentSegment at the specified location along currentSegment.
      currentSegment.QueryNormal(esriSegmentExtension.esriNoExtension, 0.5, true, currentSegment.Length / 3, normal);

      //Since each normal vector is not connected to others, create a new path for each one.
      ISegmentCollection newPath = new PathClass();
      object missing = Type.Missing;
      newPath.AddSegment(normal
      as ISegment, ref missing, ref missing);
      //The spatial reference associated with geometryCollection will be assigned to all incoming paths and segments.
      geometryCollection.AddGeometry(newPath as IGeometry, ref missing, ref missing);

      segments.Next(
      out currentSegment,ref partIndex, ref segmentIndex);
      }

      //The geometryCollection now contains the new, multipart polyline.
      return geometryCollection as IPolyline;
      }

        ISegment接口的QueryNormal方法用來在弧段上的某一點生成該弧段的法線,指定其長度,這樣就生成了新的segment,并且多個path添加到geometryCollection中,以IPolyline的形式返回。


        Polylines


        Polylines是有序path組成的集合,可以擁有M、Z和ID屬性值。Polyline對象的IPointCollection接口包含了所有節點的復制,IGeometryCollection接口可以獲取polyline的paths,ISegmentCollection接口可以獲取 polyline的segments。


        Polyline結構圖

        Polygons


        Polygon是一系列rings組成的集合,可以擁有M、Z和ID屬性值。每一個ring由一個或多個segment組成,Polygon或ring對象的IPointCollection接口包含了所有節點的復制,IGeometryCollection接口可以獲取polygon的rings, ISegmentCollection接口可以獲取polygon的segments。


        Polygon結構圖

        Multipatch


        Multipatch用于描述3D面狀幾何類型,由一系列的矢量三角形構成,如果其中的part是一個ring,那么它必須是封閉的,第一個節點和最后一個節點相同,另外每個part所包含節點的順序非常重要,Inner Rings在Outer Rings之后,代表單個表面patch的一系列rings必須由第一個ring開始。

        在9.0以后的開發包中,使用IGeneralMultiPatchCreator創建新的Multipatch,IGeometryMaterial進行材質貼圖。

      以下為引用的內容:
      public IMultiPatch CreateMultipatch()
      {
      //Prepare the geometry material list.
      IGeometryMaterial texture = new GeometryMaterialClass();
      texture.TextureImage
      = "C:\\Temp\\MyImage.bmp";

      IGeometryMaterialList materialList
      = new GeometryMaterialListClass();
      materialList.AddMaterial(texture);

      //Create the multipatch.
      IGeneralMultiPatchCreator multiPatchCreator = new GeneralMultiPatchCreatorClass();
      multiPatchCreator.Init(
      4, 1, false, false, false, 4, materialList);

      //Set up part.

      //Could also use a Ring or a TriangleFan.
      multiPatchCreator.SetPatchType(0, esriPatchType.esriPatchTypeTriangleStrip);
      multiPatchCreator.SetMaterialIndex(
      0, 0);
      multiPatchCreator.SetPatchPointIndex(
      0, 0);
      multiPatchCreator.SetPatchTexturePointIndex(
      0, 0);

      //Set real-world points.
      WKSPointZ upperLeft = new WKSPointZ();
      WKSPointZ lowerLeft
      = new WKSPointZ();
      WKSPointZ upperRight
      = new WKSPointZ();
      WKSPointZ lowerRight
      = new WKSPointZ();

      upperLeft.X
      = 0;
      upperLeft.Y
      = 0;
      upperLeft.Z
      = 0;
      upperRight.X
      = 300;
      upperRight.Y
      = 0;
      upperRight.Z
      = 0;
      lowerLeft.X
      = 0;
      lowerLeft.Y
      = 0;
      lowerLeft.Z
      = -100;
      lowerRight.X
      = 300;
      lowerRight.Y
      = 1;
      lowerRight.Z
      = -100;

      multiPatchCreator.SetWKSPointZ(
      0, ref upperRight);
      multiPatchCreator.SetWKSPointZ(
      1, ref lowerRight);
      multiPatchCreator.SetWKSPointZ(
      2, ref upperLeft);
      multiPatchCreator.SetWKSPointZ(
      3, ref lowerLeft);

      //Set texture points.
      //Set the texture coordinates for a panel.
      WKSPoint textureUpperLeft = new WKSPoint();
      WKSPoint textureLowerLeft
      = new WKSPoint();
      WKSPoint textureUpperRight
      = new WKSPoint();
      WKSPoint textureLowerRight
      = new WKSPoint();

      textureUpperLeft.X
      = 0;
      textureUpperLeft.Y
      = 0;
      textureUpperRight.X
      = 1;
      textureUpperRight.Y
      = 0;
      textureLowerLeft.X
      = 0;
      textureLowerLeft.Y
      = 1;
      textureLowerRight.X
      = 1;
      textureLowerRight.Y
      = 1;

      multiPatchCreator.SetTextureWKSPoint(
      0, ref textureUpperRight);
      multiPatchCreator.SetTextureWKSPoint(
      1, ref textureLowerRight);
      multiPatchCreator.SetTextureWKSPoint(
      2, ref textureUpperLeft);
      multiPatchCreator.SetTextureWKSPoint(
      3, ref textureLowerLeft);
      IMultiPatch multiPatch
      = multiPatchCreator.CreateMultiPatch() as IMultiPatch;

      return multiPatch;
      }

      分享:AJAX實現web頁面中級聯菜單的設計
        看了大峽搞的級聯菜單,我也班門弄斧一把,嘿嘿,花了一點時間搞了個級聯菜單貼上來看看。本例中只要你選擇成員分類名稱就會自動顯示成員名稱: 首先在eclipse中建一個項目,名稱你自

      來源:模板無憂//所屬分類:.Net教程/更新時間:2008-08-22
      相關.Net教程