public AppInfo() { //D;\MapWinGIS\MapWinGIS\bin string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetAssembly(this.GetType()).Location); ApplicationPluginDir = App.Path + "\\" + "ApplicationPlugins"; Version = App.VersionString; Developer = "MapWinGIS Team"; BuildDate = ""; Comments = ""; _ApplicationName = "MapWinGIS"; _SplashTime = 2; _URL = "http://www.baidu.com"; _ShowWelcomeScreen = true; _ShowMapWinGISVersion = true; _HelpFilePath = path + "\\help\\MapWinGIS.chm"; _DefaultDir = path; _FormIcon = MapWinGIS.MainProgram.Properties.Resources.MapWinGIS; _UseSplashScreen = true; m_neverShowProjectionDialog = false; ProjectionDialog_PreviousNoProjAnswer = ""; ProjectionDialog_PreviousMismatchAnswer = ""; m_showLoadingReport = true; OverrideSystemLocale = false; Locale = string.Empty; ProjectReloading = false; m_symbologyLoadingBehavior = SymbologyBehavior.DefaultOptions; m_projectionAbsenceBehavior = Interfaces.ProjectionAbsenceBehavior.AssignFromProject; m_projectionMismatchBehavior = Interfaces.ProjectionMismatchBehavior.Reproject; m_favoriteProjections = new List <int>(); m_favoriteProjections.Add(4326); m_favoriteProjections.Add(3857); LogfilePath = App.Path + "\\" + "Log"; }
//设置缺省行为 private void SetAbsenceBehavior(ProjectionAbsenceBehavior behavior) { btnAbsenceAssign.Checked = (behavior == ProjectionAbsenceBehavior.AssignFromProject); btnAbsenceIgnore.Checked = (behavior == ProjectionAbsenceBehavior.IgnoreAbsence); btnAbsenceSkip.Checked = (behavior == ProjectionAbsenceBehavior.SkipFile); }
/// <summary> /// 测试单层投影 /// </summary> /// <param name="layer">图层源(Shapefile或grid对象)</param> /// <param name="newLayer">输出新图层</param> /// <returns>返回测试结果</returns> public TestingResult TestLayer(LayerSource layer, out LayerSource newLayer) { if (layer == null) { throw new ArgumentException("空图层引用被通过"); } newLayer = null; MapWinGIS.GeoProjection projectProj = m_mapWin.Project.GeoProjection; MapWinGIS.GeoProjection layerProj = layer.Projection; bool isSame = projectProj.get_IsSameExt(layerProj, layer.Extents, 10); // 让我们看看我们是否有项目的投影的一种方言 if (!isSame && !projectProj.IsEmpty) { ProjectionDatabase db = (ProjectionDatabase)m_mapWin.ProjectionDatabase;//投影数据源 if (db != null) { CoordinateSystem cs = db.GetCoordinateSystem(projectProj, ProjectionSearchType.Enhanced);//坐标系统 if (cs != null) { db.ReadDialects(cs); foreach (string dialect in cs.Dialects) { MapWinGIS.GeoProjection projTemp = new MapWinGIS.GeoProjection(); if (!projTemp.ImportFromAutoDetect(dialect)) { continue; } if (layerProj.get_IsSame(projTemp)) { isSame = true; break; } } } } } // 投影中可以包含的文件的后缀名,让我们试着用正确的后缀搜索文件 if (!isSame) { if (CoordinateTransformation.SeekSubstituteFile(layer, projectProj, out newLayer)) { m_report.AddFile(layer.Filename, layer.Projection.Name, ProjectionOperaion.Substituted, newLayer.Filename); return(TestingResult.Substituted); } } if (!layer.Projection.IsEmpty) { if (projectProj.IsEmpty) { // 层具有投影,项目没有;分配到投影,不提示用户 // 让我们找个众所周知的投影与EPSG编码 ProjectionDatabase db = m_mapWin.ProjectionDatabase as ProjectionDatabase; if (db != null) { CoordinateSystem cs = db.GetCoordinateSystem(layerProj, ProjectionSearchType.UseDialects); if (cs != null) { MapWinGIS.GeoProjection proj = new MapWinGIS.GeoProjection(); if (proj.ImportFromEPSG(cs.Code)) { layerProj = proj; } } } m_mapWin.Project.GeoProjection = layerProj; return(TestingResult.Ok); } else if (isSame) { // 相同投影 return(TestingResult.Ok); } else { // 用户必须被提示 if (!m_usePreviousAnswerMismatch && !m_mapWin.ApplicationInfo.NeverShowProjectionDialog) { bool dontShow = false; bool useForOthers = false; ArrayList list = new ArrayList(); list.Add("Ignore mismatch"); list.Add("Reproject file"); //list.Add("Skip file"); // PM 2013-05-03: list.Add("Don't load the layer"); frmProjectionMismatch form = new frmProjectionMismatch((ProjectionDatabase)m_mapWin.ProjectionDatabase); int choice = form.ShowProjectionMismatch(list, (int)m_mapWin.ApplicationInfo.ProjectionMismatchBehavior, projectProj, layer.Projection, out useForOthers, out dontShow); form.Dispose(); if (choice == -1) { return(TestingResult.CancelOperation); } m_usePreviousAnswerMismatch = useForOthers; m_mapWin.ApplicationInfo.ProjectionMismatchBehavior = (ProjectionMismatchBehavior)choice; m_mapWin.ApplicationInfo.NeverShowProjectionDialog = dontShow; } MapWinGIS.Interfaces.ProjectionMismatchBehavior behavior = m_mapWin.ApplicationInfo.ProjectionMismatchBehavior; switch (behavior) { case ProjectionMismatchBehavior.Reproject: TestingResult result = CoordinateTransformation.ReprojectLayer(layer, out newLayer, projectProj, m_report); if (result == TestingResult.Ok || result == TestingResult.Substituted) { ProjectionOperaion oper = result == TestingResult.Ok ? ProjectionOperaion.Reprojected : ProjectionOperaion.Substituted; string newName = newLayer == null ? "" : newLayer.Filename; m_report.AddFile(layer.Filename, layer.Projection.Name, oper, newName); return(newName == layer.Filename ? TestingResult.Ok : TestingResult.Substituted); } else { m_report.AddFile(layer.Filename, layer.Projection.Name, ProjectionOperaion.FailedToReproject, ""); return(TestingResult.Error); } case ProjectionMismatchBehavior.IgnoreMismatch: m_report.AddFile(layer.Filename, layer.Projection.Name, ProjectionOperaion.MismatchIgnored, ""); return(TestingResult.Ok); case ProjectionMismatchBehavior.SkipFile: m_report.AddFile(layer.Filename, layer.Projection.Name, ProjectionOperaion.Skipped, ""); return(TestingResult.SkipFile); } } } else if (!projectProj.IsEmpty) // 图层投影是空的 { bool projectProjectionExists = !projectProj.IsEmpty; // 用户必须被提示 if (!m_usePreviousAnswerAbsence && !m_mapWin.ApplicationInfo.NeverShowProjectionDialog) { bool dontShow = false; bool useForOthers = false; ArrayList list = new ArrayList(); // 当在投影第一变体应排除 int val = projectProjectionExists ? 0 : 1; if (projectProjectionExists) { // PM 2013-05-03: //list.Add("Assign projection from project"); list.Add("Use the project's projection"); } // list.Add("Ignore the absence"); // list.Add("Skip the file"); list.Add("Ignore the missing of projection file"); list.Add("Don't load the layer"); frmProjectionMismatch form = new frmProjectionMismatch((ProjectionDatabase)m_mapWin.ProjectionDatabase); int choice = form.ShowProjectionAbsence(list, (int)m_mapWin.ApplicationInfo.ProjectionAbsenceBehavior - val, projectProj, out useForOthers, out dontShow); form.Dispose(); if (choice == -1) { return(TestingResult.CancelOperation); } choice += val; m_usePreviousAnswerAbsence = useForOthers; m_mapWin.ApplicationInfo.ProjectionAbsenceBehavior = (ProjectionAbsenceBehavior)choice; m_mapWin.ApplicationInfo.NeverShowProjectionDialog = dontShow; } // 当在项目没有投影,它不能分配层 ProjectionAbsenceBehavior behavior = m_mapWin.ApplicationInfo.ProjectionAbsenceBehavior; if (!projectProjectionExists && m_mapWin.ApplicationInfo.ProjectionAbsenceBehavior == ProjectionAbsenceBehavior.AssignFromProject) { behavior = ProjectionAbsenceBehavior.IgnoreAbsence; } switch (behavior) { case ProjectionAbsenceBehavior.AssignFromProject: m_report.AddFile(layer.Filename, layer.Projection.Name, ProjectionOperaion.Assigned, ""); layer.Projection = projectProj; return(TestingResult.Ok); case ProjectionAbsenceBehavior.IgnoreAbsence: m_report.AddFile(layer.Filename, layer.Projection.Name, ProjectionOperaion.AbsenceIgnored, ""); return(TestingResult.Ok); case ProjectionAbsenceBehavior.SkipFile: m_report.AddFile(layer.Filename, layer.Projection.Name, ProjectionOperaion.Skipped, ""); return(TestingResult.SkipFile); } } else { // 层没有投影,项目也没有,不在这里 } System.Diagnostics.Debug.Print("Invalid result in projection tester"); return(TestingResult.Ok); }