ArcMapAddinVisibility.ViewModels.RLOSViewModel.CreateMapElement C# (CSharp) Метод

CreateMapElement() приватный Метод

Where all of the work is done. Override from TabBaseViewModel
private CreateMapElement ( ) : void
Результат void
        internal override void CreateMapElement()
        {
            if (!CanCreateElement || ArcMap.Document == null || ArcMap.Document.FocusMap == null || string.IsNullOrWhiteSpace(SelectedSurfaceName))
                return;

            //base.CreateMapElement();

            var surface = GetSurfaceFromMapByName(ArcMap.Document.FocusMap, SelectedSurfaceName);

            if (surface == null)
                return;

            using (ComReleaser oComReleaser = new ComReleaser())
            {

                // Create feature workspace
                IFeatureWorkspace workspace = CreateFeatureWorkspace("tempWorkspace");

                StartEditOperation((IWorkspace)workspace);

                // Create feature class
                IFeatureClass pointFc = CreateObserversFeatureClass(workspace, "Output" + RunCount.ToString());

                double finalObserverOffset = GetOffsetInZUnits(ArcMap.Document.FocusMap, ObserverOffset.Value, surface.ZFactor, OffsetUnitType);
                double finalSurfaceOffset = GetOffsetInZUnits(ArcMap.Document.FocusMap, SurfaceOffset, surface.ZFactor, OffsetUnitType);

                double conversionFactor = GetConversionFactor(ArcMap.Document.FocusMap.SpatialReference);
                double convertedMinDistance = MinDistance * conversionFactor;
                double convertedMaxDistance = MaxDistance * conversionFactor;
                double finalMinDistance = GetLinearDistance(ArcMap.Document.FocusMap, convertedMinDistance, OffsetUnitType);
                double finalMaxDistance = GetLinearDistance(ArcMap.Document.FocusMap, convertedMaxDistance, OffsetUnitType);

                double finalLeftHorizontalFOV = GetAngularDistance(ArcMap.Document.FocusMap, LeftHorizontalFOV, AngularUnitType);
                double finalRightHorizontalFOV = GetAngularDistance(ArcMap.Document.FocusMap, RightHorizontalFOV, AngularUnitType);
                double finalBottomVerticalFOV = GetAngularDistance(ArcMap.Document.FocusMap, BottomVerticalFOV, AngularUnitType);
                double finalTopVerticalFOV = GetAngularDistance(ArcMap.Document.FocusMap, TopVerticalFOV, AngularUnitType);

                // Out radius geometries
                List<IGeometry> radius2GeomList = new List<IGeometry>();
                List<IGeometry> radius1_2GeomList = new List<IGeometry>();
                List<IGeometry> donutGeomList = new List<IGeometry>();

                foreach (var observerPoint in ObserverAddInPoints)
                {
                    // Create buffer geometries for final Min/Max distance
                    ITopologicalOperator topologicalOperator = observerPoint.Point as ITopologicalOperator;
                    IGeometry geom = topologicalOperator.Buffer(finalMaxDistance);
                    radius2GeomList.Add(geom);
                    radius1_2GeomList.Add(geom);
                    if (finalMinDistance > 0)
                    {
                        IGeometry geom2 = topologicalOperator.Buffer(finalMinDistance);

                        ITopologicalOperator eraseTopo = geom as ITopologicalOperator;
                        IGeometry erasedGeom = eraseTopo.Difference(geom2);
                        donutGeomList.Add(erasedGeom);
                    }
                    else
                    {
                        radius1_2GeomList.Add(geom);
                    }

                    double z1 = surface.GetElevation(observerPoint.Point) + finalObserverOffset;

                    //create a new point feature
                    IFeature ipFeature = pointFc.CreateFeature();

                    // Set the field values for the feature
                    SetFieldValues(finalObserverOffset, finalSurfaceOffset, finalMinDistance, finalMaxDistance, finalLeftHorizontalFOV,
                        finalRightHorizontalFOV, finalBottomVerticalFOV, finalTopVerticalFOV, ipFeature);

                    //Create shape
                    IPoint point = new PointClass() { Z = z1, X = observerPoint.Point.X, Y = observerPoint.Point.Y, ZAware = true };
                    ipFeature.Shape = point;
                    ipFeature.Store();
                }

                IFeatureClassDescriptor fd = new FeatureClassDescriptorClass();
                fd.Create(pointFc, null, "OBJECTID");

                StopEditOperation((IWorkspace)workspace);

                try
                {
                    ILayer layer = GetLayerFromMapByName(ArcMap.Document.FocusMap, SelectedSurfaceName);
                    string layerPath = GetLayerPath(layer);

                IFeatureLayer ipFeatureLayer = new FeatureLayerClass();
                ipFeatureLayer.FeatureClass = pointFc;

                IDataset ipDataset = (IDataset)pointFc;
                string outputFcName = ipDataset.BrowseName + "_output";
                string strPath = ipDataset.Workspace.PathName + "\\" + ipDataset.BrowseName;
                string outPath = ipDataset.Workspace.PathName + "\\" + outputFcName;

                IVariantArray parameters = new VarArrayClass();
                    parameters.Add(layerPath);
                parameters.Add(strPath);
                parameters.Add(outPath);

                    esriLicenseStatus status = GetSpatialAnalystLicense();

                    IGeoProcessor2 gp = new GeoProcessorClass();

                    gp.AddOutputsToMap = false;

                    // Add a mask to buffer the output to selected distance
                    SetGPMask(workspace, radius2GeomList, gp, "radiusMask");

                    object oResult = gp.Execute("Visibility_sa", parameters, null);
                    IGeoProcessorResult ipResult = (IGeoProcessorResult)oResult;

                    ComReleaser.ReleaseCOMObject(gp);
                    gp = null;
                    GC.Collect();

                    // Add buffer geometries to the map
                    foreach (IGeometry geom in radius1_2GeomList)
                    {
                        var color = new RgbColorClass() { Blue = 255 } as IColor;
                        AddGraphicToMap(geom, color, true);
                    }

                    IRasterLayer outputRasterLayer = new RasterLayerClass();
                    outputRasterLayer.CreateFromFilePath(outPath);

                    string fcName = IntersectOutput(outputRasterLayer, ipDataset, workspace, donutGeomList);

                    IFeatureClass finalFc = workspace.OpenFeatureClass(fcName);

                    IFeatureLayer outputFeatureLayer = new FeatureLayerClass();
                    outputFeatureLayer.FeatureClass = finalFc;

                    //Add it to a map if the layer is valid.
                    if (outputFeatureLayer != null)
                    {
                        // set the renderer
                        IFeatureRenderer featRend = UnqueValueRenderer(workspace, finalFc);
                        IGeoFeatureLayer geoLayer = outputFeatureLayer as IGeoFeatureLayer;
                        geoLayer.Renderer = featRend;
                        geoLayer.Name = "VisibilityLayer_" + RunCount.ToString();

                        // Set the layer transparency
                        IDisplayFilterManager filterManager = (IDisplayFilterManager)outputFeatureLayer;
                        ITransparencyDisplayFilter filter = new TransparencyDisplayFilter();
             			            filter.Transparency = 80;
             			            filterManager.DisplayFilter = filter;

                        ESRI.ArcGIS.Carto.IMap map = ArcMap.Document.FocusMap;
                        map.AddLayer((ILayer)outputFeatureLayer);
                    }

                    RunCount += 1;
                }
                catch (Exception ex)
                {
                    string exception = ex.ToString();
                    System.Windows.MessageBox.Show(VisibilityLibrary.Properties.Resources.MsgTryAgain, VisibilityLibrary.Properties.Resources.MsgCalcCancelled);
                }

                //Reset(true);
            }
        }