首页 > 代码库 > 使用Proj.Net创建空间参考
使用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 }
自己尝试写一个工厂没有写完全:
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 }
使用Proj.Net创建空间参考
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。