using System; using System.Collections.Generic; using GeoScene.Data; using GeoScene.Globe; namespace Cyberpipe { //本类作用为:辅助GlobalControl上Feature的统计分析工具类 class FeatureStatisticsService { /// <summary> /// 统计指定图层在指定范围内的所有feature对象 /// </summary> /// <param name="polygon"></param> /// <param name="layer"></param> /// <param name="type"></param> /// <returns></returns> public static GSOFeatures Intersect_PointLayerByType(GSOGeoPolygon3D polygon, GSOLayer layer, string type) { if (layer == null) return null; GSOFeatureLayer flayer = layer as GSOFeatureLayer; if (polygon == null) { return flayer.GetFeatureByFieldValue("附属物名称", type, true); } GSOFeatures feats = flayer.FindFeaturesInPolygon(polygon, false); GSOFeatures newfeats = new GSOFeatures(); for (int j = 0; j < feats.Length; j++) { if (feats[j].GetFieldAsString("附属物名称").EndsWith(type)) { newfeats.Add(feats[j]); } } return newfeats; } /// /// <summary> /// 根据附属物列表,统计该类附属物个数 /// </summary> ///<param name="feats">附属物列表</param> /// <returns></returns> public Dictionary<string, int> getFeatureCountByFeatures(GSOFeatures feats) { if (feats == null || feats.Length == 0) return null; Dictionary<string, int> result = new Dictionary<string, int>(); result.Add(feats[0].GetFieldAsString("附属物名称"), feats.Length); return result; } /// <summary> /// 获取指定图层、范围以及上下限的管线信息 /// </summary> /// <param name="polygon"></param> /// <param name="layer"></param> /// <param name="min"></param> /// <param name="max"></param> /// <param name="fieldName"></param> /// <returns></returns> public FeaturesClassfyResult getPipesInfoByValueSection(GSOGeoPolygon3D polygon, GSOLayer layer, double? min, double? max, string fieldName) { if (layer == null) return null; FeaturesClassfyResult result = new FeaturesClassfyResult(); double totalLength = 0.0; int ncount = 0; GSOFeatures features = getPipesByValueSection(polygon, layer, min, max, fieldName); for (int i = 0; i < features.Length; i++) { GSOGeoPolyline3D line = features[i].Geometry as GSOGeoPolyline3D; if (line == null) continue; double length = line.GetSpaceLength(true, 6378137); totalLength += length; ncount += 1; } string filedValue = (min == null) ? "不限" : min + "-"; filedValue += (max == null) ? "不限" : max + ""; result.layerName = layer.Caption; result.groupFieldValue = filedValue;//上下限的拼接 result.ncount = ncount; result.sum = Math.Round(totalLength, 2); return result; } /// <summary> /// 根据绘制区域、图层以及上下限获取满足条件的管线列表 /// </summary> /// <param name="polygon">绘制的区域,为空则表示全区域统计</param> /// <param name="layer">所选的图层</param> /// <param name="min">下限</param> /// <param name="max">上限</param> /// <param name="fieldName">统计类型:"起始埋深"或"管径_毫米"</param> /// <returns></returns> public GSOFeatures getPipesByValueSection(GSOGeoPolygon3D polygon, GSOLayer layer, double? min, double? max, string fieldName) { if (layer == null) return null; GSOFeatures result = new GSOFeatures(); GSOFeatureLayer flayer = layer as GSOFeatureLayer; //TODOLIST:优化为只获取管线,目前不清楚调用方式 GSOFeatures feats = (polygon == null) ? flayer.GetAllFeatures() : flayer.FindFeaturesInPolygon(polygon, false); double minValue = min ?? Double.MinValue; double maxValue = max ?? Double.MaxValue; //筛选出符合条件的 for (int i = 0; i < feats.Length; i++) { double radius = feats[i].GetFieldAsDouble(fieldName); if (radius >= minValue && radius <= maxValue) { result.Add(feats[i]); } } return result; } //图层名称、管径、条数、总长度 public List<FeaturesClassfyResult> groupPipeByDiameter(GSOGeoPolygon3D polygon, GSOLayer layer) { if (layer == null) return null; List<FeaturesClassfyResult> result = new List<FeaturesClassfyResult>(); GSOFeatureLayer flayer = layer as GSOFeatureLayer; //TODOLIST:优化为只获取管线,目前不清楚调用方式 GSOFeatures feats = (polygon == null) ? flayer.GetAllFeatures() : flayer.FindFeaturesInPolygon(polygon, false); List<float> lstDiameter = new List<float>(); for (int j = 0; j < feats.Length; j++) { if (!lstDiameter.Contains(feats[j].GetFieldAsFloat("管径_毫米"))) { lstDiameter.Add(feats[j].GetFieldAsFloat("管径_毫米")); } } lstDiameter.Sort(); if (lstDiameter.Count > 0) { foreach (float diameter in lstDiameter) { double totalLength = 0.00; int ncount = 0; for (int j = 0; j < feats.Length; j++) { if (Math.Abs(feats[j].GetFieldAsFloat("管径_毫米") - diameter) > 0.00001) continue; GSOGeoPolyline3D line = feats[j].Geometry as GSOGeoPolyline3D; if (line == null) continue; double length = line.GetSpaceLength(true, 6378137); totalLength += length; ncount += 1; } FeaturesClassfyResult featuresClass = new FeaturesClassfyResult(); featuresClass.layerName = layer.Caption; featuresClass.groupFieldValue = diameter.ToString(); featuresClass.ncount = ncount; featuresClass.sum = Math.Round(totalLength, 2); result.Add(featuresClass); } } return result; } //图层名称、附属物个数 /// <summary> /// 分类统计图层中附属物个数 /// </summary> /// <param name="polygon"></param> /// <param name="layer"></param> /// <returns></returns> public List<FeaturesClassfyResult> groupAccessories(GSOGeoPolygon3D polygon, GSOLayer layer) { if (layer == null) return null; List<FeaturesClassfyResult> result = new List<FeaturesClassfyResult>(); GSOFeatureLayer flayer = layer as GSOFeatureLayer; //layer.Name是表名 string[] accessStrs = Utility.getAccStrsByLayer(layer.Name); foreach (string accssname in accessStrs) { GSOFeatures feats; int ncount; if (polygon == null) { feats = flayer.GetFeatureByFieldValue("附属物名称", accssname, true); ncount = feats.Length; } else { feats = flayer.FindFeaturesInPolygon(polygon, false); GSOFeatures newfeats = new GSOFeatures(); //过滤 for (int n = 0; n < feats.Length; n++) { if (feats[n].GetFieldAsString("附属物名称").Contains(accssname)) newfeats.Add(feats[n]); } ncount = newfeats.Length; } FeaturesClassfyResult featuresClass = new FeaturesClassfyResult(); featuresClass.layerName = accssname; featuresClass.ncount = ncount; result.Add(featuresClass); } return result; } /// <summary> /// 统计指定材质的管线信息 /// </summary> /// <param name="polygon"></param> /// <param name="layer"></param> /// <param name="material">材质</param> /// <returns></returns> public FeaturesClassfyResult groupPipeByMaterial(GSOGeoPolygon3D polygon, GSOLayer layer, string material) { if (layer == null) return null; FeaturesClassfyResult result = new FeaturesClassfyResult(); GSOFeatureLayer flayer = layer as GSOFeatureLayer; //TODOLIST:优化为只获取管线,目前不清楚调用方式 GSOFeatures feats = (polygon == null) ? flayer.GetAllFeatures() : flayer.FindFeaturesInPolygon(polygon, false); string fixedMaterial = material == "无" ? "" : material; double totalLength = 0.00; int ncount = 0; for (int i = 0; i < feats.Length; i++) { if (feats[i].GetFieldAsString("材质").Equals(fixedMaterial)) { GSOGeoPolyline3D line = feats[i].Geometry as GSOGeoPolyline3D; if (line != null) { double length = line.GetSpaceLength(true, 6378137); totalLength += length; ncount += 1; } } } result.layerName = layer.Caption; result.groupFieldValue = material; result.ncount = ncount; result.sum = totalLength; return result; } /// <summary> /// 获取特定区域图层的管线列表,并将其总长度统计出来 /// </summary>TODOLIST:将Intersects_Pipeline在MainFrm中去除 /// <param name="polygon"></param> /// <param name="layer"></param> /// <param name="length">要统计的长度</param> /// <returns></returns> public static GSOFeatures getLayerPipes(GSOGeoPolygon3D polygon, GSOLayer layer, out double length) { length = 0; if (layer == null) return null; GSOFeatures feats = getLayerFeatures(polygon, layer); double totallength = 0.00; for (int i = 0; i < feats.Length; i++) { GSOFeature feat = feats[i]; GSOGeoPolyline3D line = feat.Geometry as GSOGeoPolyline3D; if (line == null) continue; double pipeLength = line.GetSpaceLength(true, 6378137); totallength += pipeLength; } //double toLength = Convert.ToDouble(totallength.ToString().Substring(0, totallength.ToString().IndexOf("."))); length = Math.Floor(totallength); return feats; } /// <summary> /// 获取区域图层内的feature列表,MainFrm.PolygonIntersectAnalysis和此方法重复,需要整理删除 /// </summary> /// <param name="polygon"></param> /// <param name="layer"></param> /// <returns></returns> public static GSOFeatures getLayerFeatures(GSOGeoPolygon3D polygon, GSOLayer layer) { if (layer == null) return null; GSOFeatureLayer flayer = layer as GSOFeatureLayer; return polygon == null ? flayer.GetAllFeatures() : flayer.FindFeaturesInPolygon(polygon, false); } /// <summary> /// 获取globeControl上选中的管线,如果返回空则没有选中的管线 /// </summary> /// <param name="globeControl">地球引擎</param> /// <returns>返回一根线</returns> public static GSOFeature GetSelectedPipeline(GSOGlobeControl globeControl) { GSOFeature resFeature; if (globeControl.Globe.SelObjectCount < 1) return null; GSOLayer resLayer; globeControl.Globe.GetSelectObject(0, out resFeature, out resLayer); if (resFeature == null) return null; GSOGeoPolyline3D line1 = resFeature.Geometry as GSOGeoPolyline3D; if (line1 == null) return null; GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; return pipeStyle1 == null ? null : resFeature; } } }