|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using ESRI.ArcGIS.Geodatabase;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using Kingo.Mobile.Shape2KOTool;
|
|
|
|
|
using ESRI.ArcGIS.Geometry;
|
|
|
|
|
using ESRI.ArcGIS.Carto;
|
|
|
|
|
using KGIS.Framework.Utils;
|
|
|
|
|
using KGIS.Framework.AE.ExtensionMethod;
|
|
|
|
|
using OSGeo.OGR;
|
|
|
|
|
using OSGeo.GDAL;
|
|
|
|
|
using Kingo.Plugin.MakeTaskPackage.Model;
|
|
|
|
|
using ESRI.ArcGIS.DataSourcesFile;
|
|
|
|
|
using ESRI.ArcGIS.DataSourcesGDB;
|
|
|
|
|
using KGIS.Framework.Maps;
|
|
|
|
|
|
|
|
|
|
namespace Kingo.Plugin.MakeTaskPackage.Common
|
|
|
|
|
{
|
|
|
|
|
public class ArcFeatureDataSource : Kingo.Mobile.Shape2KOTool.KoDataBase.ISpatialDataSource
|
|
|
|
|
{
|
|
|
|
|
private IQueryFilter pQueryFilter = new QueryFilterClass()
|
|
|
|
|
{
|
|
|
|
|
WhereClause = "1=1"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private IQueryFilter pSpatialFilter = new SpatialFilterClass()
|
|
|
|
|
{
|
|
|
|
|
WhereClause = "1=1"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private DataRow dr = null;
|
|
|
|
|
public ArcFeatureDataSource(IFeatureClass featureClass, ESRI.ArcGIS.Geometry.IGeometry queryGeometry, string geometryField, string whereClause, List<Kingo.Mobile.Shape2KOTool.XSDClass.Field> fields)
|
|
|
|
|
{
|
|
|
|
|
this.FeatureSource = featureClass;
|
|
|
|
|
if (!string.IsNullOrEmpty(whereClause))
|
|
|
|
|
this.pQueryFilter.WhereClause = whereClause;
|
|
|
|
|
IEnvelope envelope = (FeatureSource as IGeoDataset).Extent;
|
|
|
|
|
if (queryGeometry != null)
|
|
|
|
|
{
|
|
|
|
|
pSpatialFilter = new SpatialFilterClass() { Geometry = queryGeometry, GeometryField = geometryField, SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects, WhereClause = this.pQueryFilter.WhereClause };
|
|
|
|
|
envelope = queryGeometry.Envelope;
|
|
|
|
|
}
|
|
|
|
|
//获取字段
|
|
|
|
|
this.Fields = new List<ShapeFieldInfo>();
|
|
|
|
|
for (int i = 0; i < FeatureSource.Fields.FieldCount; i++)
|
|
|
|
|
{
|
|
|
|
|
IField field = FeatureSource.Fields.get_Field(i);
|
|
|
|
|
//Kingo.Mobile.Shape2KOTool.XSDClass.Field fieldS = fields.Find(p => p.Name.ToLower() == field.Name.ToLower());
|
|
|
|
|
//if (fieldS == null) continue;
|
|
|
|
|
if (featureClass.ShapeFieldName == field.Name)
|
|
|
|
|
continue;
|
|
|
|
|
this.Fields.Add(ConvertArcFieldToShapeFieldInfo(FeatureSource.Fields.get_Field(i), null));
|
|
|
|
|
}
|
|
|
|
|
//获取空间参考
|
|
|
|
|
ISpatialReference spatialReference = (FeatureSource as IGeoDataset).SpatialReference;
|
|
|
|
|
int wkid = spatialReference.FactoryCode;
|
|
|
|
|
SpatialRefrenceStruct srs = SpatialRefrenceStruct.GetAllData().Find(p => p.WKID == wkid);
|
|
|
|
|
if (srs != null)
|
|
|
|
|
{
|
|
|
|
|
this.SpatialReference = srs;
|
|
|
|
|
}
|
|
|
|
|
this.RecordCount = FeatureSource.FeatureCount(pQueryFilter);
|
|
|
|
|
// 获取图形类型 点 线 面
|
|
|
|
|
this.GeometryType = (Mobile.Shape2KOTool.XSDClass.esriGeometryType)FeatureSource.ShapeType;
|
|
|
|
|
//计算最大范围
|
|
|
|
|
|
|
|
|
|
if (envelope.IsEmpty)
|
|
|
|
|
{
|
|
|
|
|
//当图层数据为空时,extent为空
|
|
|
|
|
this.Extent = new Mobile.Shape2KOTool.XSDClass.EnvelopeN();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.Extent = new Kingo.Mobile.Shape2KOTool.XSDClass.EnvelopeN()
|
|
|
|
|
{
|
|
|
|
|
XMax = envelope.XMax,
|
|
|
|
|
XMin = envelope.XMin,
|
|
|
|
|
YMax = envelope.YMax,
|
|
|
|
|
YMin = envelope.YMin
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
//创建DataTable
|
|
|
|
|
Table = new DataTable();
|
|
|
|
|
foreach (var item in this.Fields)
|
|
|
|
|
{
|
|
|
|
|
Table.Columns.Add(item.FieldName, typeof(object));
|
|
|
|
|
}
|
|
|
|
|
//this.Table.Columns.Add("OBJECTID", typeof(int));
|
|
|
|
|
this.Table.Columns.Add("SHAPE", typeof(string));
|
|
|
|
|
dr = Table.NewRow();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ArcFeatureDataSource( IFeatureLayer featureLayer, ESRI.ArcGIS.Geometry.IGeometry queryGeometry, string where="")
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
//// 注册所有的驱动
|
|
|
|
|
//Ogr.RegisterAll();
|
|
|
|
|
//Gdal.AllRegister();
|
|
|
|
|
////消除中文路径无法识别的问题
|
|
|
|
|
//OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
|
|
|
|
|
////解决shape文件字段中文内容读取问题
|
|
|
|
|
//OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8");
|
|
|
|
|
|
|
|
|
|
this.FeatureSource = featureLayer.FeatureClass;
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(where))
|
|
|
|
|
{
|
|
|
|
|
this.pQueryFilter.WhereClause = where;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.pQueryFilter.WhereClause = (featureLayer as IFeatureLayerDefinition).DefinitionExpression;
|
|
|
|
|
}
|
|
|
|
|
IEnvelope envelope = (FeatureSource as IGeoDataset).Extent;
|
|
|
|
|
if (queryGeometry != null)
|
|
|
|
|
{
|
|
|
|
|
pSpatialFilter = new SpatialFilterClass() { Geometry = queryGeometry, GeometryField = featureLayer.FeatureClass.ShapeFieldName, SpatialRel = esriSpatialRelEnum.esriSpatialRelContains, WhereClause = this.pQueryFilter.WhereClause };
|
|
|
|
|
envelope = queryGeometry.Envelope;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
pSpatialFilter.WhereClause = where;
|
|
|
|
|
}
|
|
|
|
|
//获取字段
|
|
|
|
|
this.Fields = new List<ShapeFieldInfo>();
|
|
|
|
|
ILayerFields layerFields = featureLayer as ILayerFields;
|
|
|
|
|
for (int i = 0; i < FeatureSource.Fields.FieldCount; i++)
|
|
|
|
|
{
|
|
|
|
|
IField field = FeatureSource.Fields.get_Field(i);
|
|
|
|
|
int index = layerFields.FindField(field.Name);
|
|
|
|
|
IFieldInfo fieldInfo = layerFields.get_FieldInfo(index);
|
|
|
|
|
if (!fieldInfo.Visible)
|
|
|
|
|
continue;
|
|
|
|
|
if (FeatureSource.ShapeFieldName == field.Name)
|
|
|
|
|
continue;
|
|
|
|
|
this.Fields.Add(ConvertArcFieldToShapeFieldInfo(FeatureSource.Fields.get_Field(i), fieldInfo.Alias));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//增加SHAPE_AREA 字段
|
|
|
|
|
//int areaIndex= layerFields.FindField("SHAPE_AREA");
|
|
|
|
|
//if (areaIndex < 0)
|
|
|
|
|
//{
|
|
|
|
|
// this.Fields.Add(new ShapeFieldInfo() {
|
|
|
|
|
// FieldName="SHAPE_AREA",
|
|
|
|
|
// FieldAlias = "SHAPE_AREA",
|
|
|
|
|
// FieldType= eFieldType.shpDouble
|
|
|
|
|
// });
|
|
|
|
|
//}
|
|
|
|
|
//获取空间参考
|
|
|
|
|
ISpatialReference spatialReference = (FeatureSource as IGeoDataset).SpatialReference;
|
|
|
|
|
int wkid = spatialReference.FactoryCode;
|
|
|
|
|
SpatialRefrenceStruct srs = SpatialRefrenceStruct.GetAllData().Find(p => p.WKID == wkid);
|
|
|
|
|
if (srs != null)
|
|
|
|
|
{
|
|
|
|
|
this.SpatialReference = srs;
|
|
|
|
|
}
|
|
|
|
|
this.RecordCount = FeatureSource.FeatureCount(pQueryFilter);
|
|
|
|
|
// 获取图形类型 点 线 面
|
|
|
|
|
this.GeometryType = (Mobile.Shape2KOTool.XSDClass.esriGeometryType)FeatureSource.ShapeType;
|
|
|
|
|
//计算最大范围
|
|
|
|
|
if (envelope.IsEmpty)
|
|
|
|
|
{
|
|
|
|
|
//当图层数据为空时,extent为空
|
|
|
|
|
this.Extent = new Mobile.Shape2KOTool.XSDClass.EnvelopeN();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.Extent = new Kingo.Mobile.Shape2KOTool.XSDClass.EnvelopeN()
|
|
|
|
|
{
|
|
|
|
|
XMax = envelope.XMax,
|
|
|
|
|
XMin = envelope.XMin,
|
|
|
|
|
YMax = envelope.YMax,
|
|
|
|
|
YMin = envelope.YMin
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
//创建DataTable
|
|
|
|
|
Table = new DataTable();
|
|
|
|
|
foreach (var item in this.Fields)
|
|
|
|
|
{
|
|
|
|
|
Table.Columns.Add(item.FieldName, typeof(object));
|
|
|
|
|
}
|
|
|
|
|
//this.Table.Columns.Add("OBJECTID", typeof(int));
|
|
|
|
|
this.Table.Columns.Add("SHAPE", typeof(string));
|
|
|
|
|
dr = Table.NewRow();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogAPI.Debug("获取图层信息失败:" + ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private DataTable Table = null;
|
|
|
|
|
private IFeatureCursor pFeatureCursor = null;
|
|
|
|
|
|
|
|
|
|
public void Close()
|
|
|
|
|
{
|
|
|
|
|
if (pFeatureCursor != null)
|
|
|
|
|
{
|
|
|
|
|
Marshal.ReleaseComObject(pFeatureCursor);
|
|
|
|
|
pFeatureCursor = null;
|
|
|
|
|
}
|
|
|
|
|
this.EOF = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IFeatureClass FeatureSource { get; private set; }
|
|
|
|
|
|
|
|
|
|
public string DataSourcePath { get; set; }
|
|
|
|
|
|
|
|
|
|
public Dictionary<string, int> Distinct(string fieldName)
|
|
|
|
|
{
|
|
|
|
|
Dictionary<string, int> values = new Dictionary<string, int>();
|
|
|
|
|
//ICursor cursor = (ICursor)FeatureSource.Search(null, false);
|
|
|
|
|
//IDataStatistics dataStatistics = new DataStatisticsClass();
|
|
|
|
|
//dataStatistics.Field = "Layer";
|
|
|
|
|
//dataStatistics.Cursor = cursor;
|
|
|
|
|
//System.Collections.IEnumerator enumerator = dataStatistics.UniqueValues;
|
|
|
|
|
//enumerator.Reset();
|
|
|
|
|
//while (enumerator.MoveNext())
|
|
|
|
|
//{
|
|
|
|
|
// object myObject = enumerator.Current;
|
|
|
|
|
// values.Add(myObject.ToString(), 0);
|
|
|
|
|
//}
|
|
|
|
|
////cursor = (ICursor)featureClass.Search(null, false);
|
|
|
|
|
//dataStatistics.Cursor = cursor;
|
|
|
|
|
//ESRI.ArcGIS.esriSystem.IStatisticsResults statisticsResults = dataStatistics.Statistics;
|
|
|
|
|
|
|
|
|
|
//Console.WriteLine("mean value - {0}", statisticsResults.Mean);
|
|
|
|
|
IDataset pDataset = FeatureSource as IDataset;
|
|
|
|
|
IQueryDef pQueryDef = (pDataset.Workspace.WorkspaceFactory as IFeatureWorkspace).CreateQueryDef();
|
|
|
|
|
pQueryDef.SubFields = "count(*)," + fieldName;
|
|
|
|
|
pQueryDef.Tables = pDataset.Name + " group by " + fieldName;
|
|
|
|
|
ICursor pCur = pQueryDef.Evaluate();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
IRow row = pCur.NextRow();
|
|
|
|
|
while (row != null)
|
|
|
|
|
{
|
|
|
|
|
values.Add(row.get_Value(1).ToString(), Convert.ToInt32(row.get_Value(0)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Marshal.ReleaseComObject(pCur);
|
|
|
|
|
pCur = null;
|
|
|
|
|
Marshal.ReleaseComObject(pQueryDef);
|
|
|
|
|
pQueryDef = null;
|
|
|
|
|
}
|
|
|
|
|
return values;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool EOF { get; private set; }
|
|
|
|
|
|
|
|
|
|
public Mobile.Shape2KOTool.XSDClass.EnvelopeN Extent { get; private set; }
|
|
|
|
|
|
|
|
|
|
public List<Mobile.Shape2KOTool.ShapeFieldInfo> Fields { get; set; }
|
|
|
|
|
|
|
|
|
|
public Mobile.Shape2KOTool.XSDClass.esriGeometryType GeometryType { get; private set; }
|
|
|
|
|
|
|
|
|
|
public System.Data.DataTable GetAllRecord()
|
|
|
|
|
{
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
|
}
|
|
|
|
|
private IFeature pFeature = null;
|
|
|
|
|
public System.Data.DataRow GetNextRecord()
|
|
|
|
|
{
|
|
|
|
|
if (EOF == true)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("读取已经结束");
|
|
|
|
|
}
|
|
|
|
|
if (pFeatureCursor == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("没有打开数据");
|
|
|
|
|
}
|
|
|
|
|
//DateTime dt1 = DateTime.Now;
|
|
|
|
|
//Console.WriteLine(DateTime.Now.ToString());
|
|
|
|
|
DataRow row = ConvertFeature2DataRow(pFeature);
|
|
|
|
|
//DateTime dt2 = DateTime.Now;
|
|
|
|
|
//Console.WriteLine(dt2.Subtract(dt1).TotalMilliseconds.ToString());
|
|
|
|
|
//释放资源
|
|
|
|
|
|
|
|
|
|
Marshal.ReleaseComObject(pFeature);
|
|
|
|
|
pFeature = null;
|
|
|
|
|
pFeature = pFeatureCursor.NextFeature();
|
|
|
|
|
if (pFeature == null)
|
|
|
|
|
{
|
|
|
|
|
EOF = true;
|
|
|
|
|
}
|
|
|
|
|
//DateTime dt3 = DateTime.Now;
|
|
|
|
|
//Console.WriteLine(dt3.Subtract(dt2).TotalMilliseconds.ToString());
|
|
|
|
|
//GC.Collect();
|
|
|
|
|
//row.Delete();
|
|
|
|
|
//row = null;
|
|
|
|
|
return row;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private System.Data.DataRow ConvertFeature2DataRow(IFeature feature)
|
|
|
|
|
{
|
|
|
|
|
//DateTime dt1 = DateTime.Now;
|
|
|
|
|
//Console.WriteLine(DateTime.Now.ToString());
|
|
|
|
|
//DataRow dr = Table.NewRow();
|
|
|
|
|
foreach (DataColumn item in Table.Columns)
|
|
|
|
|
{
|
|
|
|
|
int index = feature.Fields.FindField(item.ColumnName);
|
|
|
|
|
if (index > -1)
|
|
|
|
|
{
|
|
|
|
|
dr[item] = feature.get_Value(index);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//DateTime dt2 = DateTime.Now;
|
|
|
|
|
//Console.WriteLine(dt2.Subtract(dt1).TotalMilliseconds.ToString());
|
|
|
|
|
//if (feature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon)
|
|
|
|
|
//{
|
|
|
|
|
// IArea area = feature.Shape as IArea;
|
|
|
|
|
// if (area != null)
|
|
|
|
|
// dr["SHAPE_AREA"] = area.Area;
|
|
|
|
|
//}
|
|
|
|
|
//else
|
|
|
|
|
// dr["SHAPE_AREA"] = 0;
|
|
|
|
|
dr["SHAPE"] = GetShapeString(feature.ShapeCopy);
|
|
|
|
|
//DateTime dt3 = DateTime.Now;
|
|
|
|
|
//Console.WriteLine(dt3.Subtract(dt2).TotalMilliseconds.ToString());
|
|
|
|
|
return dr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string GetShapeString(IGeometry geometry)
|
|
|
|
|
{
|
|
|
|
|
byte[] wkb = ConvertGeometryToWKB(geometry);
|
|
|
|
|
OSGeo.OGR.Geometry rstGeometry = null;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
rstGeometry = OSGeo.OGR.Geometry.CreateFromWkb(wkb);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogAPI.Debug("rstGeometry:" + ex.Message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string wkt = "";
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
rstGeometry.ExportToWkt(out wkt);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogAPI.Debug("rstGeometry.ExportToWkt:" + ex.Message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return wkt;
|
|
|
|
|
if (geometry.GeometryType == esriGeometryType.esriGeometryPolygon)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
IPolygon polygon = geometry as IPolygon;
|
|
|
|
|
if (polygon == null || polygon.IsEmpty)
|
|
|
|
|
return "MULTIPOLYGON EMPTY";
|
|
|
|
|
//"MULTIPOLYGON ((( 39496841.71395018 3996653.16102896, 39496672.94504374 3996656.38199206, 39496669.92898465 3996498.40799711, 39496838.69799109 3996495.18603399, 39496841.71395018 3996653.16102896)))"
|
|
|
|
|
|
|
|
|
|
IGeometryCollection pGeometryCollection = polygon as IGeometryCollection;
|
|
|
|
|
if (pGeometryCollection == null || pGeometryCollection.GeometryCount < 1)
|
|
|
|
|
return "MULTIPOLYGON EMPTY";
|
|
|
|
|
StringBuilder sb = new StringBuilder("MULTIPOLYGON ((");
|
|
|
|
|
for (int i = 0; i < pGeometryCollection.GeometryCount; i++)
|
|
|
|
|
{
|
|
|
|
|
if (pGeometryCollection.get_Geometry(i) is IRing)
|
|
|
|
|
{
|
|
|
|
|
sb.Append("(");
|
|
|
|
|
IPointCollection pPoints = pGeometryCollection.get_Geometry(i) as IPointCollection;
|
|
|
|
|
for (int j = 0; j < pPoints.PointCount; j++)
|
|
|
|
|
{
|
|
|
|
|
IPoint pt = pPoints.get_Point(j);
|
|
|
|
|
sb.AppendFormat("{0} {1},", pt.X, pt.Y);
|
|
|
|
|
}
|
|
|
|
|
sb.Remove(sb.Length - 1, 1);
|
|
|
|
|
sb.Append("),");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sb.Remove(sb.Length - 1, 1);
|
|
|
|
|
sb.Append("))");
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (geometry.GeometryType == esriGeometryType.esriGeometryPoint)
|
|
|
|
|
{
|
|
|
|
|
IPoint point = geometry as IPoint;
|
|
|
|
|
if (point == null) return "POINT EMPTY";
|
|
|
|
|
return string.Format("POINT ( {0} {1})", point.X, point.Y);
|
|
|
|
|
}
|
|
|
|
|
else if (geometry.GeometryType == esriGeometryType.esriGeometryPolyline)
|
|
|
|
|
{
|
|
|
|
|
IPolyline polygon = geometry as IPolyline;
|
|
|
|
|
if (polygon == null || polygon.IsEmpty)
|
|
|
|
|
return "MULTILINESTRING EMPTY";
|
|
|
|
|
//"MULTIPOLYGON ((( 39496841.71395018 3996653.16102896, 39496672.94504374 3996656.38199206, 39496669.92898465 3996498.40799711, 39496838.69799109 3996495.18603399, 39496841.71395018 3996653.16102896)))"
|
|
|
|
|
|
|
|
|
|
IGeometryCollection pGeometryCollection = polygon as IGeometryCollection;
|
|
|
|
|
if (pGeometryCollection == null || pGeometryCollection.GeometryCount < 1)
|
|
|
|
|
return "MULTILINESTRING EMPTY";
|
|
|
|
|
StringBuilder sb = new StringBuilder("MULTILINESTRING (");
|
|
|
|
|
for (int i = 0; i < pGeometryCollection.GeometryCount; i++)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (pGeometryCollection.get_Geometry(i) is IPointCollection)
|
|
|
|
|
{
|
|
|
|
|
sb.Append("(");
|
|
|
|
|
IPointCollection pPoints = pGeometryCollection.get_Geometry(i) as IPointCollection;
|
|
|
|
|
for (int j = 0; j < pPoints.PointCount; j++)
|
|
|
|
|
{
|
|
|
|
|
IPoint pt = pPoints.get_Point(j);
|
|
|
|
|
sb.AppendFormat("{0} {1},", pt.X, pt.Y);
|
|
|
|
|
}
|
|
|
|
|
sb.Remove(sb.Length - 1, 1);
|
|
|
|
|
sb.Append("),");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sb.Remove(sb.Length - 1, 1);
|
|
|
|
|
sb.Append(")");
|
|
|
|
|
return sb.ToString(); ;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return "EMPTY";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public byte[] ConvertGeometryToWKB(IGeometry geometry)
|
|
|
|
|
{
|
|
|
|
|
IWkb wkb = geometry as IWkb;
|
|
|
|
|
//byte[] b = new byte[wkb.WkbSize];
|
|
|
|
|
//int byte_count = wkb.WkbSize;
|
|
|
|
|
//try
|
|
|
|
|
//{
|
|
|
|
|
// wkb.ExportToWkb(ref byte_count, out b[0]);
|
|
|
|
|
//}
|
|
|
|
|
//catch (Exception ex)
|
|
|
|
|
//{
|
|
|
|
|
// Kingo.Mobile.Common.LogAPI.Debug(ex);
|
|
|
|
|
//}
|
|
|
|
|
//return b;
|
|
|
|
|
ITopologicalOperator oper = geometry as ITopologicalOperator;
|
|
|
|
|
oper.Simplify();
|
|
|
|
|
IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
|
|
|
|
|
byte[] b = factory.CreateWkbVariantFromGeometry(geometry) as byte[];
|
|
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//public string ConvertGeometryToWKT(IGeometry geometry)
|
|
|
|
|
//{
|
|
|
|
|
// byte[] b = ConvertGeometryToWKB(geometry);
|
|
|
|
|
// WKBReader reader = new WKBReader();
|
|
|
|
|
// GeoAPI.Geometries.IGeometry g = reader.Read(b);
|
|
|
|
|
// WKTWriter writer = new WKTWriter();
|
|
|
|
|
// return writer.Write(g);
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
public void Open()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (FeatureSource == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("矢量数据为空!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pFeatureCursor != null)
|
|
|
|
|
{
|
|
|
|
|
Marshal.ReleaseComObject(pFeatureCursor);
|
|
|
|
|
pFeatureCursor = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pFeature != null)
|
|
|
|
|
{
|
|
|
|
|
Marshal.ReleaseComObject(pFeature);
|
|
|
|
|
pFeature = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pFeatureCursor = FeatureSource.Search(pSpatialFilter, false);
|
|
|
|
|
pFeature = pFeatureCursor.NextFeature();
|
|
|
|
|
//防止没有记录
|
|
|
|
|
if (pFeature == null)
|
|
|
|
|
{
|
|
|
|
|
EOF = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
EOF = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogAPI.Debug("打开数据源失败:" + ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private ShapeFieldInfo ConvertArcFieldToShapeFieldInfo(IField field, string aliasName)
|
|
|
|
|
{
|
|
|
|
|
ShapeFieldInfo pShapeFieldInfo = new ShapeFieldInfo();
|
|
|
|
|
pShapeFieldInfo.FieldName = field.Name;
|
|
|
|
|
pShapeFieldInfo.FieldAlias = aliasName;
|
|
|
|
|
pShapeFieldInfo.FieldSize = (short)field.Length;
|
|
|
|
|
pShapeFieldInfo.FieldDecimal = (short)field.Scale;
|
|
|
|
|
switch (field.Type)
|
|
|
|
|
{
|
|
|
|
|
case esriFieldType.esriFieldTypeInteger:
|
|
|
|
|
case esriFieldType.esriFieldTypeSmallInteger:
|
|
|
|
|
pShapeFieldInfo.FieldType = eFieldType.shpInteger;
|
|
|
|
|
break;
|
|
|
|
|
case esriFieldType.esriFieldTypeDouble:
|
|
|
|
|
case esriFieldType.esriFieldTypeSingle:
|
|
|
|
|
pShapeFieldInfo.FieldType = eFieldType.shpDouble;
|
|
|
|
|
break;
|
|
|
|
|
case esriFieldType.esriFieldTypeString:
|
|
|
|
|
case esriFieldType.esriFieldTypeGlobalID:
|
|
|
|
|
case esriFieldType.esriFieldTypeGUID:
|
|
|
|
|
case esriFieldType.esriFieldTypeOID:
|
|
|
|
|
case esriFieldType.esriFieldTypeXML:
|
|
|
|
|
case esriFieldType.esriFieldTypeDate:
|
|
|
|
|
pShapeFieldInfo.FieldType = eFieldType.shpText;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
//pShapeFieldInfo.FieldType = eFieldType.shpDate;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
pShapeFieldInfo.FieldType = eFieldType.shpText;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return pShapeFieldInfo;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int RecordCount { get; private set; }
|
|
|
|
|
|
|
|
|
|
public void Reset()
|
|
|
|
|
{
|
|
|
|
|
if (pFeatureCursor != null)
|
|
|
|
|
{
|
|
|
|
|
Marshal.ReleaseComObject(pFeatureCursor);
|
|
|
|
|
pFeatureCursor = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pFeature != null)
|
|
|
|
|
{
|
|
|
|
|
Marshal.ReleaseComObject(pFeature);
|
|
|
|
|
pFeature = null;
|
|
|
|
|
}
|
|
|
|
|
pFeatureCursor = FeatureSource.Search(pQueryFilter, false);
|
|
|
|
|
pFeature = pFeatureCursor.NextFeature();
|
|
|
|
|
//防止没有记录
|
|
|
|
|
if (pFeature == null)
|
|
|
|
|
{
|
|
|
|
|
EOF = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
EOF = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Mobile.Shape2KOTool.SpatialRefrenceStruct SpatialReference { get; private set; }
|
|
|
|
|
}
|
|
|
|
|
}
|