年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

547 lines
24 KiB

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Client;
using ESRI.ArcGIS.Client.FeatureService.Symbols;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.Maps;
using KGIS.Framework.OpenData.Control;
using KGIS.Framework.OpenData.Filter;
using KGIS.Framework.OpenData.InterFace;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Client.Geometry;
using ESRI.ArcGIS;
using ESRI.ArcGIS.Display;
using TestMultiGetPointsTranslate.Model;
using OSGeo.GDAL;
using System.Threading;
using System.IO;
namespace TestMultiGetPointsTranslate.View
{
public partial class TestMultiGetPointsTranslateForm : Form
{
MultiPointTranslate multiPointTranslates;
string SourceImgPath = string.Empty;
public TestMultiGetPointsTranslateForm()
{
ESRI.ArcGIS.RuntimeManager.Bind(ProductCode.EngineOrDesktop);
InitializeComponent();
multiPointTranslates = new MultiPointTranslate();
this.Icon = new Icon("Main.ico");
}
private void TestMultiGetPointsTranslateForm_Load(object sender, EventArgs e)
{
axMapControl1.OnMouseMove += AxMapControl1_OnMouseMove;
axMapControl2.OnMouseMove += AxMapControl2_OnMouseMove;
}
private void btSetSpatialReference_Click(object sender, EventArgs e)
{
try
{
IGeoDataset s = GetGisFileSource();
if (s == null || s.SpatialReference == null)
{
return;
}
axMapControl1.SpatialReference = s.SpatialReference;
}
catch (Exception ex)
{
//LogAPI.Debug("新建工程 页面 中 导入坐标系 时失败,异常原因: " + ex + " ; ");
//MessageHelper.ShowTips("导入坐标参考系异常:" + ex.Message);
}
}
private IGeoDataset GetGisFileSource()
{
try
{
OpenDataDialog pDialog = new OpenDataDialog();
ISpatialDataObjectFilter pOFilter;
pOFilter = new FilterDatasetsAndLayers();
pDialog.AddFilter(pOFilter, true);
pDialog.Title = "选择矢量图层数据";
pDialog.AllowMultiSelect = false;
pDialog.RestoreLocation = true;
pDialog.StartLocation = pDialog.FinalLocation;
if (pDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0)
{
foreach (ISpatialDataObject distObj in pDialog.Selection)
{
if (distObj.DatasetType == esriDatasetType.esriDTFeatureClass)
{
return (distObj.DatasetName as ESRI.ArcGIS.esriSystem.IName).Open() as IGeoDataset;
}
}
}
return null;
}
catch (Exception ex)
{
LogAPI.Debug("获取GIS文件源时失败,异常原因: " + ex + " ; ");
return null;
}
}
private void AxMapControl1_OnMouseMove(object sender, AxESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
{
// 获取当前鼠标位置的屏幕坐标
System.Drawing.Point screenPoint = new System.Drawing.Point(e.x, e.y);
// 将屏幕坐标转换为地图坐标
IPoint mapPoint = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(screenPoint.X, screenPoint.Y);
// 显示地图坐标点
tbCoordinates.Text = $"X: {mapPoint.X}, Y: {mapPoint.Y}";
}
private void AxMapControl2_OnMouseMove(object sender, AxESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
{
// 获取当前鼠标位置的屏幕坐标
System.Drawing.Point screenPoint = new System.Drawing.Point(e.x, e.y);
// 将屏幕坐标转换为地图坐标
IPoint mapPoint = axMapControl2.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(screenPoint.X, screenPoint.Y);
// 显示地图坐标点
tbCoordinates.Text = $"X: {mapPoint.X}, Y: {mapPoint.Y}";
}
private void btAddMapLeft_Click(object sender, EventArgs e)
{
LoadMap(this.axMapControl1);
}
private void btAddMapRight_Click(object sender, EventArgs e)
{
SourceImgPath = LoadMap(this.axMapControl2);
}
IRasterDataset pRasterDataset = null;
private string LoadMap(AxESRI.ArcGIS.Controls.AxMapControl axMapControl)
{
try
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "选择影像文件";
openFileDialog.Filter = "栅格文件|*.img;*.tiff;*.tif";
openFileDialog.RestoreDirectory = true;
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK)
{
return string.Empty;
}
string selectPath = openFileDialog.FileName;
string Path = System.IO.Path.GetDirectoryName(selectPath);
string strFileName = System.IO.Path.GetFileName(selectPath);
IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(Path, 0);
IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;
pRasterDataset = pRasterWorkspace.OpenRasterDataset(strFileName);
IRaster pRaster = pRasterDataset.CreateDefaultRaster();
IRasterLayer pRasterLayer = new RasterLayer();
pRasterLayer.CreateFromRaster(pRaster);
ILayer featureLayer = pRasterLayer as ILayer;
if (axMapControl == axMapControl1)
{
featureLayer.SpatialReference = axMapControl1.SpatialReference;
}
else
{
featureLayer.SpatialReference = null;
axMapControl.SpatialReference = null;
}
axMapControl.AddLayer(featureLayer);
axMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, axMapControl.Extent);
return selectPath;
}
catch (Exception ex)
{
LogAPI.Debug("加载影像数据 异常:" + ex.Message);
LogAPI.Debug("加载影像数据 异常:" + ex.StackTrace);
MessageHelper.ShowError("加载影像数据失败:" + ex.Message);
}
return string.Empty;
}
// 查找已有点的方法
private IElement FindExisting1Point(IPoint point, double tolerance)
{
IEnumElement enumElement = axMapControl1.ActiveView.GraphicsContainer.LocateElements(point, tolerance);
if (enumElement == null) return null;
IElement element = enumElement.Next();
while (element != null)
{
return element;
}
return null;
}
private IElement FindExisting2Point(IPoint point, double tolerance)
{
IEnumElement enumElement = axMapControl2.ActiveView.GraphicsContainer.LocateElements(point, tolerance);
if (enumElement == null) return null;
IElement element = enumElement.Next();
while (element != null)
{
return element;
}
return null;
}
private void axMapControl1_OnMouseDown(object sender, AxESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
if (e.button == 2) // 检测是否为右键点击
{
ControlsMapPanToolClass pan = new ControlsMapPanToolClass();
pan.OnCreate(axMapControl1.Object);
ControlsMapPanToolClass pan2 = new ControlsMapPanToolClass();
pan2.OnCreate(axMapControl2.Object);
axMapControl1.CurrentTool = pan;
axMapControl2.CurrentTool = pan2;
button1.Text = "选取像控点";
this.axMapControl1.OnMouseDown -= axMapControl1_OnMouseDown;
this.axMapControl2.OnMouseDown -= axMapControl2_OnMouseDown;
}
else if (e.button == 1)
{
if (button1.Text == "选取像控点")
return;
// 获取当前鼠标位置的屏幕坐标
System.Drawing.Point screenPoint = new System.Drawing.Point(e.x, e.y);
// 将屏幕坐标转换为地图坐标
IPoint clickedPoint = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(screenPoint.X, screenPoint.Y);
// 判断是否已有附近点存在
IElement existingPoint = FindExisting1Point(clickedPoint, 1); // 在 10 像素范围内查找已有点
if (existingPoint != null)
{
// 删除附近的点
axMapControl1.ActiveView.GraphicsContainer.DeleteElement(existingPoint);
IPoint geometryPoint = existingPoint.Geometry as IPoint;
foreach (var item in listBox1.Items)
{
if (item == null || string.IsNullOrEmpty(item.ToString())) continue;
double x = double.Parse(item.ToString().Split(',')[0].Split(':')[1]);
double y = double.Parse(item.ToString().Split(',')[1].Split(':')[1]);
if (Math.Abs(Math.Abs(geometryPoint.X) - x) < 0.001 && Math.Abs(Math.Abs(geometryPoint.Y) - y) < 0.001)
{
listBox1.Items.Remove(item);
break;
}
}
}
else
{
IRgbColor color = new RgbColor();
// 设置颜色属性
color.Red = 255;
color.Green = 0;
color.Blue = 0;
IMarkerElement pointEle = new MarkerElementClass();
IMarkerSymbol symbol = new SimpleMarkerSymbolClass();
symbol.Color = color;
symbol.Size = 10;
pointEle.Symbol = symbol;
(pointEle as IElement).Geometry = clickedPoint;
axMapControl1.ActiveView.GraphicsContainer.AddElement(pointEle as IElement, 0);
double clickpointX = Math.Abs(clickedPoint.X);
double clickpointY = Math.Abs(clickedPoint.Y);
object removeItem = $"X: {clickpointX}, Y: {clickpointY}";
listBox1.Items.Add(removeItem);
}
axMapControl1.ActiveView.Refresh();
}
}
private void axMapControl2_OnMouseDown(object sender, AxESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
if (e.button == 2) // 检测是否为右键点击
{
ControlsMapPanToolClass pan = new ControlsMapPanToolClass();
pan.OnCreate(axMapControl1.Object);
ControlsMapPanToolClass pan2 = new ControlsMapPanToolClass();
pan2.OnCreate(axMapControl2.Object);
axMapControl1.CurrentTool = pan;
axMapControl2.CurrentTool = pan2;
button1.Text = "选取像控点";
this.axMapControl1.OnMouseDown -= axMapControl1_OnMouseDown;
this.axMapControl2.OnMouseDown -= axMapControl2_OnMouseDown;
}
else if (e.button == 1)
{
if (button1.Text == "选取像控点")
return;
IRasterLayer rLayer = axMapControl2.get_Layer(0) as IRasterLayer;
// 获取栅格Band
IRaster2 raster = (IRaster2)rLayer.Raster;
IRasterProps rasterProps = (IRasterProps)raster;
int width = rasterProps.Width;
int height = rasterProps.Height;
// 获取当前鼠标位置的屏幕坐标
System.Drawing.Point screenPoint = new System.Drawing.Point(e.x, e.y);
// 将屏幕坐标转换为地图坐标
IPoint clickedPoint = axMapControl2.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(screenPoint.X, screenPoint.Y);
// 判断是否已有附近点存在
IElement existingPoint = FindExisting2Point(clickedPoint, 10); // 在 10 像素范围内查找已有点
IPoint pixelLocation = new PointClass();
raster.MapToPixel(clickedPoint.X, clickedPoint.Y, out int pCol, out int pRow);
if (existingPoint != null)
{
// 删除附近的点
axMapControl2.ActiveView.GraphicsContainer.DeleteElement(existingPoint);
IPoint geometryPoint = existingPoint.Geometry as IPoint;
foreach (var item in listBox2.Items)
{
if (item == null || string.IsNullOrEmpty(item.ToString())) continue;
int x = int.Parse(item.ToString().Split(',')[0].Split(':')[1]);
int y = int.Parse(item.ToString().Split(',')[1].Split(':')[1]);
if (Math.Abs(Math.Abs(geometryPoint.X) - x) < 0.5 && Math.Abs(Math.Abs(geometryPoint.Y) - y) < 0.5)
{
listBox2.Items.Remove(item);
break;
}
}
}
else
{
IRgbColor color = new RgbColor();
// 设置颜色属性
color.Red = 255;
color.Green = 0;
color.Blue = 0;
IMarkerElement pointEle = new MarkerElementClass();
IMarkerSymbol symbol = new SimpleMarkerSymbolClass();
symbol.Color = color;
symbol.Size = 10;
pointEle.Symbol = symbol;
(pointEle as IElement).Geometry = clickedPoint;
axMapControl2.ActiveView.GraphicsContainer.AddElement(pointEle as IElement, 0);
double clickpointX = Math.Abs(pCol);
double clickpointY = Math.Abs(pRow);
object removeItem = $"X: {clickpointX}, Y: {clickpointY}";
listBox2.Items.Add(removeItem);
}
axMapControl2.ActiveView.Refresh();
}
}
//矫正
private void btRectify_Click(object sender, EventArgs e)
{
try
{
List<MultiPointTranslates> multiPointTranslates = new List<MultiPointTranslates>();
if (listBox1.Items.Count == 0 || listBox2.Items.Count == 0)
{
MessageHelper.ShowTips("请在两个地图同时添加相同点!");
return;
}
if (listBox1.Items.Count != listBox2.Items.Count)
{
MessageHelper.ShowTips("请在两个地图添加相同数量及位置点!");
return;
}
for (int i = 0; i < listBox1.Items.Count; i++)
{
if (string.IsNullOrEmpty(listBox1.Items[i].ToString()) || string.IsNullOrEmpty(listBox2.Items[i].ToString()))
{
continue;
}
string leftPoint = listBox1.Items[i].ToString();
string rightPoint = listBox2.Items[i].ToString();
MultiPointTranslates tempMultiPointTranslate = new MultiPointTranslates();
tempMultiPointTranslate.leftMultiPointTranslate = new MultiPointTranslate();
tempMultiPointTranslate.leftMultiPointTranslate.X = double.Parse(leftPoint.Split(',')[0].Split(':')[1]);
tempMultiPointTranslate.leftMultiPointTranslate.Y = double.Parse(leftPoint.Split(',')[1].Split(':')[1]);
//tempMultiPointTranslate.leftMultiPointTranslate.X -= 40494788.4837301;
//tempMultiPointTranslate.leftMultiPointTranslate.Y -= Math.Abs(3351402.7119641);
//tempMultiPointTranslate.leftMultiPointTranslate.Y = Math.Abs(tempMultiPointTranslate.leftMultiPointTranslate.Y);
tempMultiPointTranslate.rightMultiPointTranslate = new MultiPointTranslate();
tempMultiPointTranslate.rightMultiPointTranslate.X = double.Parse(rightPoint.Split(',')[0].Split(':')[1]);
tempMultiPointTranslate.rightMultiPointTranslate.Y = double.Parse(rightPoint.Split(',')[1].Split(':')[1]);
multiPointTranslates.Add(tempMultiPointTranslate);
}
if (multiPointTranslates.Count == 0)
{
MessageHelper.ShowTips("请添加像控点!");
return;
}
if (MergeEngineByTranslate(multiPointTranslates))
{
MessageHelper.ShowTips("影像输出成功!");
}
else
{
MessageHelper.ShowTips("影像输出失败!");
}
}
catch (Exception ex)
{
LogAPI.Debug("影像输出 异常!" + ex.Message);
LogAPI.Debug("影像输出 异常!" + ex.StackTrace);
MessageHelper.ShowError("影像输出 异常!" + ex.Message);
}
}
private bool MergeEngineByTranslate(List<MultiPointTranslates> multiPointTranslates)
{
try
{
//N1 40492054.91 4111849.536 58.554
//N4 40492132.05 4111920.127 57.559
//N9 40492240.92 4111969.941 57.517
//N10 40492286.12 4111903.787 56.783
//N3 40492281.81 4111837.745 55.921
//N8 40492374.94 4111839.677 54.573
//N7 40492258.78 4111768.812 56.923
//N6 40492181.75 4111702.181 58.649
//N5 40492124.32 4111739.376 58.718
//N2 40492172.34 4111844.982 57.241
string command = "-of GTiff ";
foreach (var item in multiPointTranslates)
{
command += "-gcp " + item.rightMultiPointTranslate.X + " " + item.rightMultiPointTranslate.Y + " " + item.leftMultiPointTranslate.X + " " + item.leftMultiPointTranslate.Y + " ";
}
var options = Gdal.ParseCommandLine(command);
//var options = Gdal.ParseCommandLine("-of GTiff -gcp 404 249 38495722.906 3446828.873 -gcp 571 176 38496055.59 3447078.64");
var suntmpdir = System.IO.Path.Combine(Environment.CurrentDirectory, Guid.NewGuid().ToString().Split('-')[0]);
Gdal.GDALProgressFuncDelegate progressFuncDelegate = new Gdal.GDALProgressFuncDelegate((complete, msg, data) =>
{
if (complete >= 1)
{
//isProgressCompleted = true;
}
return 1;
});
FolderBrowserDialog m_Dialog = new FolderBrowserDialog();
System.Windows.Forms.DialogResult result = m_Dialog.ShowDialog();
if (result != System.Windows.Forms.DialogResult.OK) return false;
string m_Dir = m_Dialog.SelectedPath.Trim();
//Dataset inputDataset = Gdal.OpenShared(System.IO.Path.Combine(m_Dir, Guid.NewGuid().ToString() + ".tif"), Access.GA_ReadOnly);
string OutTempFile = System.IO.Path.Combine(m_Dir, "Temp");
if (!Directory.Exists(OutTempFile))
{
Directory.CreateDirectory(OutTempFile);
}
OutTempFile = System.IO.Path.Combine(OutTempFile, Guid.NewGuid().ToString() + ".tif");
Dataset inputDataset = Gdal.OpenShared(SourceImgPath, Access.GA_ReadOnly);
FileInfo fInfo = new FileInfo(SourceImgPath);
string OutFilePath = System.IO.Path.Combine(m_Dir, fInfo.Name);
//var newtagtiff = System.IO.Path.Combine(OutTempFile);
var outDataset = Gdal.wrapper_GDALTranslate(OutTempFile, inputDataset, new GDALTranslateOptions(options), progressFuncDelegate, "Test");
options = Gdal.ParseCommandLine("-r near -tps -co COMPRESS=PNG");
Dataset[] ds = new Dataset[] { outDataset };
//newtagtiff = System.IO.Path.Combine(suntmpdir, "bb.tif");
outDataset = Gdal.Warp(OutFilePath, ds, new GDALWarpAppOptions(options), progressFuncDelegate, "out");
//重新设置坐标参考
//var tmptiff = System.IO.Path.Combine(suntmpdir,"Tiffs", System.IO.Path.GetFileName(tifles[0]));
//var tmptifdataset = Gdal.Open(tmptiff, Access.GA_ReadOnly);
//string wktproj = "";
//outDataset.GetSpatialRef().ExportToWkt(out wktproj, new string[] { });
//outDataset.SetSpatialRef(tmptifdataset.GetSpatialRef());
outDataset.FlushCache();
outDataset.Dispose();
//tmptifdataset.FlushCache();
//tmptifdataset.Dispose();
GC.Collect();
Thread.Sleep(100);
//File.Delete(OutTempFile);
return true;
}
catch (Exception ex)
{
LogAPI.Debug("影像输出计算 异常!" + ex.Message);
LogAPI.Debug("影像输出计算 异常!" + ex.StackTrace);
return false;
}
finally
{
}
}
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "取消")
{
this.axMapControl1.OnMouseDown -= axMapControl1_OnMouseDown;
this.axMapControl2.OnMouseDown -= axMapControl2_OnMouseDown;
//this.axMapControl1.OnMouseUp -= AxMapControl1_OnMouseUp;
//this.axMapControl2.OnMouseUp -= AxMapControl2_OnMouseUp;
button1.Text = "选取像控点";
}
else
{
this.axMapControl1.OnMouseDown += axMapControl1_OnMouseDown;
this.axMapControl2.OnMouseDown += axMapControl2_OnMouseDown;
//this.axMapControl1.OnMouseUp += AxMapControl1_OnMouseUp;
//this.axMapControl2.OnMouseUp += AxMapControl2_OnMouseUp;
button1.Text = "取消";
axMapControl1.CurrentTool = null;
axMapControl2.CurrentTool = null;
}
}
}
}