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.
258 lines
11 KiB
258 lines
11 KiB
using ESRI.ArcGIS.Carto; |
|
using ESRI.ArcGIS.DataSourcesFile; |
|
using ESRI.ArcGIS.DataSourcesGDB; |
|
using ESRI.ArcGIS.Geodatabase; |
|
using ESRI.ArcGIS.Geometry; |
|
using Kingo.Plugin.ShapeToKOApp.KoDataBase; |
|
using Kingo.Plugin.ShapeToKOApp.XSDClass; |
|
using NetTopologySuite.IO; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Configuration; |
|
using System.Diagnostics; |
|
using System.IO; |
|
using System.Linq; |
|
using System.Management; |
|
using System.Reflection; |
|
using System.Runtime.InteropServices; |
|
using System.Threading; |
|
using System.Threading.Tasks; |
|
using System.Windows.Forms; |
|
using System.Windows.Threading; |
|
|
|
namespace Kingo.Plugin.ShapeToKOApp |
|
{ |
|
static class Program |
|
{ |
|
|
|
/// <summary> |
|
/// 应用程序的主入口点。 |
|
/// </summary> |
|
[STAThread] |
|
static void Main(string[] args) |
|
{ |
|
Application.EnableVisualStyles(); |
|
Application.SetCompatibleTextRenderingDefault(false); |
|
GdalConfiguration.ConfigureGdal(); |
|
GdalConfiguration.ConfigureOgr(); |
|
|
|
if (!KGIS.Framework.AE.AELicense.AoInit()) |
|
{ |
|
return; |
|
} |
|
// args = new string[] { @"G:\余杭无人机任务制作\余杭区(330110)\工程目录\举证任务\BGDB.gdb\变更数据\JCTB", "JCTB", "null", @"G:\", "null" }; |
|
//args = new string[] { @"F:\研发产品文档\02年度变更外业调绘助手\余杭区全部数据shape\测试数据\监测图斑.shp", "监测图斑",@"G:\余杭无人机任务制作\余杭区(330110)\外业调绘成果\20221212101704\Kingoit\phonemap_wydh\projects\县级数据\Source","(SFWY = '1' and(RWDCZT is null or RWDCZT = ''))", "null", "null", "null", "县级数据" }; |
|
|
|
//args = new string[] { @"F:\研发产品文档\02年度变更外业调绘助手\余杭区全部数据shape\测试数据\监测图斑.shp", "监测图斑", @"G:\余杭无人机任务制作\余杭区(330110)\外业调绘成果\20221212134757\Kingoit\phonemap_wydh\projects\县级数据\Source", "(SFWY='1' and (RWDCZT is null or RWDCZT=''))", "" ,"" ,"" ,"县级数据" }; |
|
if (args.Length != 8) |
|
{ |
|
Console.WriteLine("生成KO文件失败,参数错误"); |
|
return; |
|
} |
|
|
|
string strLayerPath = args[0].ToString(); |
|
string strLayerName = args[1].ToString(); |
|
string strOutputPath = args[2].ToString(); |
|
string strWhere = args[3].ToString(); |
|
|
|
string customLayerPath = args[4].ToString(); |
|
string customLayerName = args[5].ToString(); |
|
string customstrWhere = args[6].ToString(); |
|
string customKeyValue = args[7].ToString(); |
|
|
|
IGeometry pGeometry = null; |
|
if (strWhere == "null") |
|
strWhere = string.Empty; |
|
if (!string.IsNullOrWhiteSpace(customLayerPath) && customLayerPath != "null" && !string.IsNullOrWhiteSpace(customLayerName) && customLayerName != "null") |
|
{ |
|
IFeatureLayer pCuatomLayer = GetFeatureLayer(customLayerPath, customLayerName); |
|
if (pCuatomLayer != null && pCuatomLayer.FeatureClass != null) |
|
{ |
|
pGeometry = CustomGeometry(pCuatomLayer.FeatureClass, customstrWhere, customKeyValue); |
|
} |
|
} |
|
|
|
IFeatureLayer pFeatureLayer = GetFeatureLayer(strLayerPath, strLayerName); |
|
if (pFeatureLayer == null) |
|
{ |
|
Console.WriteLine(string.Format("生成KO文件失败,获取图层信息异常")); |
|
return; |
|
} |
|
KODBFeatureLayer koFeatureLayer = new KODBFeatureLayer(); |
|
ISpatialDataSource pSpatialDataSource = new ArcFeatureDataSource(pFeatureLayer as IFeatureLayer, pGeometry, strWhere); |
|
//shp字段 |
|
koFeatureLayer.FieldInfos = pSpatialDataSource.Fields; |
|
//设置样式 |
|
koFeatureLayer.Render = SymbolConvert.Instance().GetRenderer((pFeatureLayer as IGeoFeatureLayer).Renderer); |
|
koFeatureLayer.ItemInfoRender = SymbolConvert.Instance().GetItemInfoRenderer((pFeatureLayer as IGeoFeatureLayer).Renderer); |
|
////最小比例尺 |
|
//koFeatureLayer.MinScale = (int)pFeatureLayer.MinimumScale; |
|
////最大比例尺 |
|
//koFeatureLayer.MaxScale = (int)pFeatureLayer.MaximumScale; |
|
|
|
//图层标注 |
|
IGeoFeatureLayer geolayer = pFeatureLayer as IGeoFeatureLayer; |
|
if (geolayer != null) |
|
{ |
|
|
|
IElementCollection ec; |
|
IAnnotateLayerProperties pAnnoLayerProps; |
|
geolayer.AnnotationProperties.QueryItem(0, out pAnnoLayerProps, out ec, out ec); |
|
|
|
|
|
ILabelEngineLayerProperties pLabelEngineLayerProps = (ILabelEngineLayerProperties)pAnnoLayerProps; |
|
if (pLabelEngineLayerProps != null) |
|
{ |
|
if (!string.IsNullOrWhiteSpace(pLabelEngineLayerProps.Expression) && geolayer.DisplayAnnotation) |
|
{ |
|
koFeatureLayer.LayerLabelName = pLabelEngineLayerProps.Expression.Substring(1, pLabelEngineLayerProps.Expression.Length - 2); |
|
} |
|
else |
|
{ |
|
koFeatureLayer.LayerLabelName = ""; |
|
} |
|
} |
|
} |
|
|
|
//设置显示字段 |
|
koFeatureLayer.DisplayField = (pFeatureLayer as IFeatureLayer).DisplayField; |
|
LabelStyleConvert styleConvert = new LabelStyleConvert(); |
|
List<LabelingInfo> labelInfo = styleConvert.EsriLabelToCustomLabels((pFeatureLayer as IGeoFeatureLayer).AnnotationProperties); |
|
if (labelInfo != null && labelInfo.Count > 0) |
|
koFeatureLayer.LabelingInfo = labelInfo[0]; |
|
//设置labelinginfo |
|
koFeatureLayer.EncryptData = true; |
|
koFeatureLayer.WKID = (pFeatureLayer as IGeoDataset).SpatialReference.FactoryCode; |
|
|
|
string fileName = (pFeatureLayer as IDataset).BrowseName; |
|
koFeatureLayer.OutputFileName = strOutputPath + "\\" + fileName + ".ko"; |
|
koFeatureLayer.SpatialDataSource = pSpatialDataSource; |
|
|
|
LayerComm layerComm = new LayerComm(); |
|
koFeatureLayer.ItemInfo = layerComm.FeatureLayerToEntity(pFeatureLayer as IFeatureLayer); |
|
|
|
if (koFeatureLayer.Render is XSDClass.SimpleRenderer) |
|
koFeatureLayer.FeatureSymbol = (koFeatureLayer.Render as XSDClass.SimpleRenderer).Symbol; |
|
else if (koFeatureLayer.Render is XSDClass.UniqueValueRenderer) |
|
{ |
|
XSDClass.UniqueValueRenderer uniqueValueRander = koFeatureLayer.Render as XSDClass.UniqueValueRenderer; |
|
if (uniqueValueRander != null) |
|
koFeatureLayer.FeatureSymbol = uniqueValueRander.DefaultSymbol; |
|
} |
|
|
|
DateTime dt1 = DateTime.Now; |
|
koFeatureLayer.Report += (s, c) => |
|
{ |
|
if (koFeatureLayer == null) return; |
|
|
|
if (s == "插入数据完成!" || c == -1) |
|
{ |
|
DateTime dt3 = DateTime.Now; |
|
if (c == -1) |
|
{ |
|
Console.WriteLine(s); |
|
} |
|
else |
|
{ |
|
Console.WriteLine("完成,共用时" + dt3.Subtract(dt1).TotalSeconds.ToString("0.0") + "秒"); |
|
} |
|
|
|
if (koFeatureLayer.SpatialDataSource.RecordCount == 0) |
|
{ |
|
string msg = string.Format("{0};{1}", 100, 100); |
|
Console.WriteLine(msg); |
|
} |
|
else |
|
{ |
|
string msg = string.Format("{0};{1}", koFeatureLayer.SpatialDataSource.RecordCount, koFeatureLayer.SpatialDataSource.RecordCount); |
|
Console.WriteLine(msg); |
|
} |
|
} |
|
else |
|
{ |
|
string msg = string.Format("{0};{1};{2}", s,c, koFeatureLayer.SpatialDataSource.RecordCount); |
|
Console.WriteLine(msg); |
|
} |
|
}; |
|
|
|
koFeatureLayer.CreateLayerUdp(); |
|
} |
|
|
|
static IFeatureLayer GetFeatureLayer(string layerPath, string layerName) |
|
{ |
|
IWorkspaceFactory pWSFactory = null; |
|
IFeatureLayer pFeatureLayer = null; |
|
|
|
try |
|
{ |
|
if (!string.IsNullOrWhiteSpace(layerPath)) |
|
{ |
|
string filename = System.IO.Path.GetDirectoryName(layerPath); |
|
|
|
if (layerPath.ToLower().Contains(".shp")) |
|
{ |
|
pWSFactory = new ShapefileWorkspaceFactoryClass(); |
|
} |
|
else if (layerPath.ToLower().Contains(".gdb")) |
|
{ |
|
pWSFactory = new FileGDBWorkspaceFactory(); |
|
string fileExtension = System.IO.Path.GetExtension(filename); |
|
if (string.IsNullOrWhiteSpace(fileExtension)) |
|
{ |
|
filename = System.IO.Path.GetDirectoryName(filename); |
|
} |
|
} |
|
else if (layerPath.ToLower().Contains(".mdb")) |
|
{ |
|
pWSFactory = new AccessWorkspaceFactory(); |
|
string fileExtension = System.IO.Path.GetExtension(filename); |
|
if (string.IsNullOrWhiteSpace(fileExtension)) |
|
{ |
|
filename = System.IO.Path.GetDirectoryName(filename); |
|
} |
|
} |
|
|
|
IWorkspace pWorkspace = pWSFactory.OpenFromFile(filename, 0); |
|
System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSFactory); |
|
pWSFactory = null; |
|
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace; |
|
IFeatureClass pSourceFeatureClass = pFeatureWorkspace.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(layerPath)); |
|
if (pSourceFeatureClass != null) |
|
{ |
|
IFeatureLayer layer = new FeatureLayerClass(); |
|
layer.FeatureClass = pSourceFeatureClass; |
|
pFeatureLayer = layer; |
|
} |
|
|
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
Console.WriteLine("获取图层失败:" + ex.Message); |
|
return null; |
|
} |
|
return pFeatureLayer; |
|
} |
|
|
|
|
|
static ESRI.ArcGIS.Geometry.IGeometry CustomGeometry(IFeatureClass pCustomFC, string strWhere, string keyValue) |
|
{ |
|
IGeometry xzqGeo = null; |
|
try |
|
{ |
|
ESRI.ArcGIS.Geodatabase.IFeatureCursor featureCursor = pCustomFC.Search(new ESRI.ArcGIS.Geodatabase.QueryFilterClass() { WhereClause = string.Format(strWhere, keyValue) }, false); |
|
if (featureCursor == null) return null; |
|
ESRI.ArcGIS.Geodatabase.IFeature feature = featureCursor.NextFeature(); |
|
if (feature == null) return null; |
|
xzqGeo= feature.ShapeCopy; |
|
} |
|
catch (Exception ex) |
|
{ |
|
Console.WriteLine("获取自定义范围失败:" + ex.Message); |
|
return null; |
|
} |
|
|
|
return xzqGeo; |
|
} |
|
} |
|
}
|
|
|