PIE SDK的矢量裁剪矢量文件的Algo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PIE.SystemAlgo;
using PIE.Carto;
using System.IO;
using PIE.DataSource;
using PIE.Geometry;

namespace Algo
{
/// <summary>
/// 用矢量文件裁剪矢量文件
/// </summary>
public class VectorClipAlgo:ISystemAlgo,ISystemAlgoEvents
{
private AlgoParms m_params;
//
// 摘要:
// 描述
public string Description { get; set; }
//
// 摘要:
// 名称
public string Name { get; set; }

public object Params
{
get
{
return m_params;
}

set
{
if (value ==null)
{
return;
}
m_params = (AlgoParms)value;
}
}

public VectorClipAlgo()
{

}

public event OnProgressChangedEventHandler OnProgressChanged;
public event OnExecuteCompletedEventHandler OnExecuteCompleted;

public void GetErrorInfo(ref int errCode, ref string errMsg)
{
throw new NotImplementedException();
}

public void SetErrorInfo(int errCode, string errMsg)
{
throw new NotImplementedException();
}

public bool Execute()
{
try
{
if (!File.Exists(m_params.InputFilePath)|| !File.Exists(m_params.ShpFilePath))//如果不存在,或者不是shp文件
{
return false;
}
ILayer layer = LayerFactory.CreateDefaultLayer(m_params.InputFilePath);
ILayer flayer = LayerFactory.CreateDefaultLayer(m_params.ShpFilePath);
if (layer == null|| flayer == null)
{
return false;
}
IFeatureDataset fdataset = (layer as IFeatureLayer).FeatureClass.GetFeatureDataset();
if (m_params.Type==0)
{
ClipByShpIn(fdataset, flayer);
}
else//type==1外切
{
ClipByShpOut(fdataset, flayer);
}
fdataset.Save();
fdataset.Copy(m_params.OutputFilePath);
((IDisposable)fdataset).Dispose();
fdataset = null;
return false;
}
catch (Exception)
{
return false;
}

}

/// <summary>
/// 矢量裁切矢量文件(内切)
/// </summary>
private void ClipByShpIn(IFeatureDataset fdataset, ILayer flayer)
{
try
{
Geometry cngeo = (flayer as IFeatureLayer).FeatureClass.GetFeature(0).Geometry as Geometry;
IFeatureClass fclass = new FeatureClass(fdataset);
long fcount = fclass.GetFeatureCount();
List<IGeometry> listgeos = new List<IGeometry>();
ISpatialReference spGLL = SpatialReferenceFactory.CreateSpatialReference(4326);
for (int i = 0; i < fcount; i++)
{
IFeature feature = fclass.GetFeature(i);
if (feature == null)
{
continue;
}
IGeometry geos = feature.Geometry as Geometry;
geos.SpatialReference = spGLL;
if (geos.GetGeometryType() == GeometryType.GeometryMultiPolygon)
{
for (int h = 0; h < (geos as IGeometryCollection).GetGeometryCount(); h++)
{
IGeometry geo = (geos as MultiPolygon).GetGeometry(h);
geo.SpatialReference = spGLL;
IGeometry ingeo = cngeo.Intersection(geo);
bool flag = cngeo.Intersects(geo);
if (ingeo != null)
{
listgeos.Add(ingeo);
}
}
}
else
{
IGeometry ingeo = (cngeo as Geometry).Intersection(geos);
if (ingeo != null)
{
listgeos.Add(ingeo);
}
}
fdataset.DeleteFeature(i);
}
for (int i = 0; i < listgeos.Count; i++)
{
IFeature feature = fdataset.CreateNewFeature();
feature.Geometry = listgeos[i];
fdataset.AddFeature(feature);
}

}
catch (Exception)
{

}

}

/// <summary>
/// 矢量裁切矢量文件(外切)
/// </summary>
private void ClipByShpOut(IFeatureDataset fdataset, ILayer flayer)
{
try
{

Geometry cngeo = (flayer as IFeatureLayer).FeatureClass.GetFeature(0).Geometry as Geometry;
IFeatureClass fclass = new FeatureClass(fdataset);
List<IGeometry> listgeos = new List<IGeometry>();
List<int> ss = new List<int>();
long fcount = fclass.GetFeatureCount();
ISpatialReference spGLL = SpatialReferenceFactory.CreateSpatialReference(4326);
for (int i = 0; i < fcount; i++)
{
IFeature feature = fclass.GetFeature(i);
if (feature == null)
{
continue;
}
IGeometry geo = feature.Geometry as Geometry;

geo.SpatialReference = spGLL;
if (!(geo as Geometry).Within(cngeo))//如果不在内部
{
IGeometry ingeo = cngeo.Intersection(geo);
if (ingeo == null)
{
listgeos.Add(geo);
fdataset.DeleteFeature(i);
}
else
{
IGeometry outgeo = (geo as Geometry).Difference(ingeo as Geometry);
listgeos.Add(outgeo);
fdataset.DeleteFeature(i);
}
}
else
{
fdataset.DeleteFeature(i);
}

}
for (int i = 0; i < listgeos.Count; i++)
{
IFeature feature = fdataset.CreateNewFeature();
feature.Geometry = listgeos[i];
fdataset.AddFeature(feature);
}
listgeos.Clear();
}
catch (Exception)
{

}

}
public void RaiseExecuteCompletedEvent()
{
throw new NotImplementedException();
}
}

public class AlgoParms
{
/// <summary>
/// 输入的shp路径
/// </summary>
public string InputFilePath { get; set; }

/// <summary>
/// 0裁剪shp内部,1裁剪shp外部
/// </summary>
public int Type { get; set; }

/// <summary>
/// 需要输入的shp文件路径
/// </summary>
public string ShpFilePath { get; set; }

/// <summary>
/// 需要输出的shp文件路径
/// </summary>
public string OutputFilePath { get; set; }
/// <summary>
/// 功能名称
/// </summary>
public string FuncName { get; set; }
}
}

原文地址:https://www.cnblogs.com/Smile0709/p/12030664.html

时间: 2024-11-08 04:34:57

PIE SDK的矢量裁剪矢量文件的Algo的相关文章

PIE SDK矢量数据项查看

1功能简介 矢量数据由大量要素信息构成,矢量数据项查看可以看到数据的属性表,下面就基于PIE SDK,介绍矢量数据项查看功能的实现. 2功能实现说明 2.1实现思路及原理说明 第一步 加载图层 第二步 将图层和对话框进行绑定 2.2 核心接口与方法 接口/类 方法/属性 说明 PIE.AxControls.FeatureLayerAttributeDialog Initial(IMap map, ILayer layer) 初始化 PIE.AxControls.PIETOCNodeTag Map

PIE SDK Command&amp;&amp;Tool工具命令一览表

PIE SDK Command&&Tool工具命令一览表 编号 模板 名称(中文) Command&Tool 程序集 备注 1 数据管理 加载栅格数据 PIE.Controls.RasterCommand PIE.Controls.dll 2 加载矢量数据 PIE.Controls.VectorCommand 3 加载科学数据集数据 PIE.Controls.ScientificDatasetCommand 4 加载环境数据 PIE.Controls.LoadHJDataComma

PIE SDK组件式开发综合运用示例

1. 功能概述 关于PIE SDK的功能开发,在我们的博客上已经分门别类的进行了展示,点击PIESat博客就可以访问,为了初学者入门,本章节将对从PIE SDK组件式二次开发如何搭建界面.如何综合开发进行详细的讲解. 2. 功能实现 2.1.界面搭建 最终的界面如下图所示: 图1最终结果图 2.1.1 新建项目 选择“Window窗体应用程序”,设置程序的名称和保存路径即可.(新建完成后可以将程序的窗体名称右键重命名为“FormMain”,,将窗体界面的属性的Text设置名称为“PIE应用程序”

PIE SDK专题制图保存模板说明文档

1.    功能简介 在PIE SDK中,所有的制图元素.视图范围以及排版等都可以保存成一个模板,以供多次重复使用.使用模板时只需要打开该模板,加载相应数据,就可以直接出图,省去了重复制作图幅的麻烦,方便快捷. 每个地图模板都是一个地图文档(PmdContents),它被保存为*.pmd文件.      [模板文件]        [植被指数模板] 2. 功能实现说明 2.1保存模板 使用IMapDocument接口的Save()方法保存地图文档. 2.2 实现思路及原理说明 第一步 获取当前地

PIE SDK专题制图打开模板说明文档

1.    功能简介 在PIE SDK中,所有的制图元素.视图范围以及排版等都可以保存成一个模板,以供多次重复使用.使用时只需要打开该模板,加载相应数据,就可以直接出图了,省去了重复制作图幅的麻烦,方便快捷. 每个地图模板都是一个地图文档(PmdContents),它被保存为*.pmd文件.         [模板文件]         [植被指数模板] 2. 功能实现说明 2.1打开模板 在PIE中,每个显示的地图都是一个地图文档(PmdContents),它可以保存为*.pmd文件.用IMa

PIE SDK专题制图另存模板

1.功能简介 在PIE SDK中,所有的制图元素.视图范围以及排版等都可以保存成一个模板,以供多次重复使用.使用模板时只需要打开该模板,加载相应数据,就可以直接出图,省去了重复制作图幅的麻烦,方便快捷. 每个地图模板都是一个地图文档(PmdContents),它被保存为*.pmd文件.                                                                             [模板文件]              [植被指数模板] 2

PIE SDK彩色空间变换

1. 算法功能简介 使用彩色空间变换工具可以将三波段红.绿.蓝图像变换到一个特定的彩色空间,并且能从所选彩色空间变换回 RGB.两次变换之间,通过对比度拉伸,可以生成一个色彩增强的彩色合成图像.此外,颜色亮度值波段或亮度波段可以被另一个波段(通常具有较高的空间分辨率)代替,生成一幅合成图像(将一幅图像的色彩特征与另一幅图像的空间特征相结合). 彩色变换的一般工作流程:选择波段进行 RGB 合成显示→进行彩色变换→进行其他的图像处理→进行彩色逆变换→RGB 合成显示. PIE SDK支持算法功能的

PIE SDK傅里叶变换

1.算法功能简介 傅里叶变换能把遥感图像从空域变换到只包含不同频域信息的频域中.原图像上的灰度突变部位(如物体边缘).图像结构复杂的区域.图像细节及干扰噪声等,经傅里叶变换后,其信息大多集中在高频区:而原图像上灰度变化平缓的部位,如植被比较一致的平原.沙漠和海面等,经傅里叶变换后,大多集中在频率域中的低频区.在频率域平面中,低频区位于中心部位,而高频区位于低频区的外围,即边缘部位. 傅里叶变换是可逆的,即对图像进行傅里叶变换后得到的频率函数再做反向傅里叶变换,又可以得到原来的图像.从纯粹的数学意

PIE SDK同态滤波

1.算法功能简介 同态滤波是减少低频增加高频,从而减少光照变化并锐化边缘或细节的图像滤波方法. 同态滤波的流程为:空间域图像→对数运算→傅里叶正变换→同态滤波――傅里叶逆变换→指数运算→同态滤波结果.不同空间分辨率的遥感图像,使用同态滤波的效果不同.如果图像中的光照可以认为是均匀的,那么,进行同态滤波产生的效果不大.但是,如果光照明显是不均匀的,那么同态滤波有助于表现出图像中暗处的细节. PIE SDK支持算法功能的执行,下面对同态滤波算法功能进行介绍. 2.算法功能实现说明 2.1. 实现步骤