zoukankan      html  css  js  c++  java
  • 使用Proj.Net创建空间参考

    在RGEOS项目中,投影变换是通过Proj.Net来实现的。

    支持的投影主要包括AlbersProjection、TransverseMercator、Mercator、Krovak、Lambert Conformal Conic 2SP,自己扩展了一个GaussKruger投影。

    以下实现了一个WGS84椭球的UTM投影(TransverseMercator)

     ICoordinateSystem utm = ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WGS84_UTM(zone, pGeo.Y > 0);

    查看代码:

     1 public static ProjectedCoordinateSystem WGS84_UTM(int Zone, bool ZoneIsNorth)
     2         {
     3             List<ProjectionParameter> pInfo = new List<ProjectionParameter>();
     4             pInfo.Add(new ProjectionParameter("latitude_of_origin", 0));
     5             pInfo.Add(new ProjectionParameter("central_meridian", Zone * 6 - 183));
     6             pInfo.Add(new ProjectionParameter("scale_factor", 0.9996));
     7             pInfo.Add(new ProjectionParameter("false_easting", 500000));
     8             pInfo.Add(new ProjectionParameter("false_northing", ZoneIsNorth ? 0 : 10000000));
     9             //IProjection projection = cFac.CreateProjection("UTM" + Zone.ToString() + (ZoneIsNorth ? "N" : "S"), "Transverse_Mercator", parameters);
    10             Projection proj = new Projection("Transverse_Mercator", pInfo, "UTM" + Zone.ToString(System.Globalization.CultureInfo.InvariantCulture) + (ZoneIsNorth ? "N" : "S"),
    11                 "EPSG", 32600 + Zone + (ZoneIsNorth ? 0 : 100), String.Empty, String.Empty, String.Empty);
    12             System.Collections.Generic.List<AxisInfo> axes = new List<AxisInfo>();
    13             axes.Add(new AxisInfo("East", AxisOrientationEnum.East));
    14             axes.Add(new AxisInfo("North", AxisOrientationEnum.North));
    15             return new ProjectedCoordinateSystem(ProjNet.CoordinateSystems.HorizontalDatum.WGS84,
    16                 ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84, ProjNet.CoordinateSystems.LinearUnit.Metre, proj, axes,
    17                 "WGS 84 / UTM zone " + Zone.ToString(System.Globalization.CultureInfo.InvariantCulture) + (ZoneIsNorth ? "N" : "S"), "EPSG", 32600 + Zone + (ZoneIsNorth ? 0 : 100),
    18                 String.Empty, "Large and medium scale topographic mapping and engineering survey.", string.Empty);
    19         }
    WGS84_UTM

    自己尝试写一个工厂没有写完全:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 
      5 namespace ProjNet.CoordinateSystems
      6 {
      7     public class SpatialReferenceEnvironmentClass : ISpatialReferenceFactory
      8     {
      9         public IEllipsoid CreateSpheroid(int spheroidType)
     10         {
     11             IEllipsoid ellipsoid = null;
     12             switch (spheroidType)
     13             {
     14                 case (int)RgSRSpheroidType.RgSRSpheroid_WGS1984:
     15                     ellipsoid = new Ellipsoid(6378137, 0, 298.257223563, true, LinearUnit.Metre, "WGS 84", "EPSG", 7030, "WGS 84", "", "Inverse flattening derived from four defining parameters (semi-major axis; C20 = -484.16685*10e-6; earth's angular velocity w = 7292115e11 rad/sec; gravitational constant GM = 3986005e8 m*m*m/s/s).");
     16                     break;
     17                 case (int)RgSRSpheroidType.RgSRSpheroid_Krasovsky1940:
     18                     ellipsoid = new Ellipsoid(6378245, 0, 298.30000000000001, true, LinearUnit.Metre, "Krasovsky_1940", "EPSG", 7024, "Krasovsky_1940", "", "");
     19                     break;
     20                 case (int)RgSRSpheroid2Type.RgSRSpheroid_Xian1980:
     21                     ellipsoid = new Ellipsoid(6378140, 0, 298.25700000000001, true, LinearUnit.Metre, "Xian_1980", "EPSG", 7049, "Xian_1980", "", "");
     22                     break;
     23             }
     24             return ellipsoid;
     25         }
     26 
     27         public IHorizontalDatum CreateDatum(int datumType)
     28         {
     29             IHorizontalDatum datum = null;
     30             switch (datumType)
     31             {
     32                 case (int)RgSRDatumType.RgSRDatum_WGS1984:
     33                     IEllipsoid ellipsoid = this.CreateSpheroid((int)RgSRSpheroidType.RgSRSpheroid_WGS1984);
     34                     datum = new HorizontalDatum(ellipsoid, null, DatumType.HD_Geocentric, "World Geodetic System 1984", "EPSG", 6326, String.Empty, "EPSG's WGS 84 datum has been the then current realisation. No distinction is made between the original WGS 84 frame, WGS 84 (G730), WGS 84 (G873) and WGS 84 (G1150). Since 1997, WGS 84 has been maintained within 10cm of the then current ITRF.", String.Empty);
     35                     break;
     36                 case (int)RgSRDatumType.RgSRDatum_Beijing1954:
     37                     IEllipsoid ellipsoid2 = this.CreateSpheroid((int)RgSRSpheroidType.RgSRSpheroid_Krasovsky1940);
     38                     datum = new HorizontalDatum(ellipsoid2, null, DatumType.HD_Geocentric, "D_Beijing1954", "EPSG", 6214, String.Empty, "", String.Empty);
     39                     break;
     40                 case (int)RgSRDatumType.RgSRDatum_Xian1980:
     41                     IEllipsoid ellipsoid3 = this.CreateSpheroid((int)RgSRSpheroid2Type.RgSRSpheroid_Xian1980);
     42                     datum = new HorizontalDatum(ellipsoid3, null, DatumType.HD_Geocentric, "D_Xian1980", "EPSG", 6610, String.Empty, "", String.Empty);
     43                     break;
     44             }
     45             return datum;
     46         }
     47 
     48         public IGeographicCoordinateSystem CreateGeographicCoordinateSystem(int gcsType)
     49         {
     50             IGeographicCoordinateSystem gcs = null;
     51             switch (gcsType)
     52             {
     53 
     54                 case (int)RgSRGeoCSType.RgSRGeoCS_WGS1984:// WGS 1984. 
     55                     List<AxisInfo> axes = new List<AxisInfo>(2);
     56                     axes.Add(new AxisInfo("Lon", AxisOrientationEnum.East));
     57                     axes.Add(new AxisInfo("Lat", AxisOrientationEnum.North));
     58                     IHorizontalDatum datum = this.CreateDatum((int)RgSRDatumType.RgSRDatum_WGS1984);
     59                     gcs = new GeographicCoordinateSystem(CoordinateSystems.AngularUnit.Degrees,
     60                         datum, CoordinateSystems.PrimeMeridian.Greenwich, axes,
     61                         "WGS1984", "EPSG", 4326, String.Empty, string.Empty, string.Empty);
     62                     break;
     63                 case (int)RgSRGeoCSType.RgSRGeoCS_Beijing1954:
     64                     List<AxisInfo> axes2 = new List<AxisInfo>(2);
     65                     axes2.Add(new AxisInfo("Lon", AxisOrientationEnum.East));
     66                     axes2.Add(new AxisInfo("Lat", AxisOrientationEnum.North));
     67                     IHorizontalDatum datum2 = this.CreateDatum((int)RgSRDatumType.RgSRDatum_Beijing1954);
     68                     gcs = new GeographicCoordinateSystem(CoordinateSystems.AngularUnit.Degrees,
     69                         datum2, CoordinateSystems.PrimeMeridian.Greenwich, axes2,
     70                         "Beijing1954", "EPSG", 4214, String.Empty, string.Empty, string.Empty);
     71                     break;
     72                 case (int)RgSRGeoCS3Type.RgSRGeoCS_Xian1980://Xian80. 
     73                     List<AxisInfo> axes3 = new List<AxisInfo>(2);
     74                     axes3.Add(new AxisInfo("Lon", AxisOrientationEnum.East));
     75                     axes3.Add(new AxisInfo("Lat", AxisOrientationEnum.North));
     76                     IHorizontalDatum datum3 = this.CreateDatum((int)RgSRDatumType.RgSRDatum_Xian1980);
     77                     gcs = new GeographicCoordinateSystem(CoordinateSystems.AngularUnit.Degrees,
     78                         datum3, CoordinateSystems.PrimeMeridian.Greenwich, axes3,
     79                         "Xian1980", "EPSG", 4610, String.Empty, string.Empty, string.Empty);
     80                     break;
     81 
     82             }
     83             return gcs;
     84         }
     85 
     86         public IProjectedCoordinateSystem CreateProjectedCoordinateSystem(int pcsType)
     87         {
     88             throw new NotImplementedException();
     89         }
     90         public IProjection CreateProjection(int projectionType)
     91         {
     92             switch (projectionType)
     93             {
     94                 case (int)RgSRProjectionType.RgSRProjection_Albers:
     95                     break;
     96                 case (int)RgSRProjectionType.RgSRProjection_GaussKruger:
     97                     break;
     98                 case (int)RgSRProjectionType.RgSRProjection_Mercator:
     99                     break;
    100                 case (int)RgSRProjectionType.RgSRProjection_TransverseMercator:
    101                     break;
    102                 case (int)RgSRProjectionType.RgSRProjection_LambertConformalConic:
    103                     break;
    104             }
    105             return null;
    106         }
    107     }
    108 }
    SpatialReferenceEnvironmentClass
  • 相关阅读:
    轮播图
    .Net语言 APP开发平台——Smobiler学习日志:如何快速实现快递信息流的效果
    .Net语言 APP开发平台——Smobiler学习日志:如何实现离线声音文件上传
    .Net语言 APP开发平台——Smobiler学习日志:Poplist控件的正确打开方式以及如何快速实现
    .Net语言 APP开发平台——Smobiler学习日志:快速实现手机上的图片上传功能
    .Net语言 APP开发平台——Smobiler学习日志:快速在手机上实现n×m形式的菜单(IconMenuView)
    .Net语言 APP开发平台——Smobiler学习日志:快速在手机上实现日历功能
    .Net语言 APP开发平台——Smobiler学习日志:快速实现手机上常见的GridView
    .Net语言 APP开发平台——Smobiler学习日志:实现在手机上调用摄像头进行扫描
    .Net语言 APP开发平台——Smobiler学习日志:实现手机上常见的ListMenuView
  • 原文地址:https://www.cnblogs.com/yhlx125/p/4097278.html
Copyright © 2011-2022 走看看