/// <summary> /// 将输入的数据单位转化为米 /// </summary> /// <param name="dValue"></param> /// <param name="outUnits"></param> /// <returns></returns> public double UnitsConvertToMeters(double dValue, esriUnits outUnits) { IUnitConverter unitConverter = new UnitConverterClass(); double newValue = unitConverter.ConvertUnits(dValue, esriUnits.esriMeters, outUnits); return(newValue); }
/// <summary> /// 从比例尺列表中,选择能够展示指定要素范围的最合适比例尺 /// </summary> /// <param name="pageLayout">页面布局</param> /// <param name="mapFrame">要设定显示范围及比例尺的地图数据框</param> /// <param name="featureEnv">地图要素显示范围</param> /// <param name="scaleList">比例尺列表,将从中选取最合适的比例尺</param> /// <param name="bufferDistance">要素与图廓的缓冲距离(厘米),即地图实际显示范围是featEnvelope + 2 * bufferDistance</param> /// <returns></returns> public static double SetMapScale(this IPageLayout pageLayout, IMapFrame mapFrame, IEnvelope featureEnv, double[] scaleList, double bufferDistance = 2) { esriUnits pageUnit = pageLayout.Page.Units; esriUnits mapUnit = mapFrame.Map.DistanceUnits; esriUnits cmUnit = esriUnits.esriCentimeters; //厘米 IEnvelope mapFrameEnv = (mapFrame as IElement)?.Geometry.Envelope; IUnitConverter unitConverter = new UnitConverterClass(); double wScale = unitConverter.ConvertUnits(featureEnv.Width, mapUnit, cmUnit) / (unitConverter.ConvertUnits(mapFrameEnv.Width, pageUnit, cmUnit) - 2 * bufferDistance); double hScale = unitConverter.ConvertUnits(featureEnv.Height, mapUnit, cmUnit) / (unitConverter.ConvertUnits(mapFrameEnv.Height, pageUnit, cmUnit) - 2 * bufferDistance); double dScale = wScale > hScale ? wScale : hScale; int maxIndex = 0; while (maxIndex < scaleList.Length && dScale > scaleList[maxIndex]) { maxIndex++;//寻找比要素全图廓显示所确定的比例尺小一级的比例尺 } if (maxIndex == scaleList.Length) { throw new Exception("需要更小的比例尺!"); } return(scaleList[maxIndex]); }
/// <summary> /// 内插中间贞函数,只需给出第一帧和最后一帧的状态信息,即可内插出中间帧状态 /// </summary> /// <param name="pGlobe"></param> /// <param name="doubleX1_Tar">第一帧目标点X坐标</param> /// <param name="doubleY1_Tar">第一帧目标点Y坐标</param> /// <param name="doubleZ1_Tar">第一帧目标点Z坐标</param> /// <param name="doubleX1_Obs">第一帧观察点X坐标</param> /// <param name="doubleY1_Obs">第一帧观察点Y坐标</param> /// <param name="doubleZ1_Obs">第一帧观察点Z坐标</param> /// <param name="doubleX2_Tar">第二帧目标点X坐标</param> /// <param name="doubleY2_Tar">第二帧目标点Y坐标</param> /// <param name="doubleZ2_Tar">第二帧目标点Z坐标</param> /// <param name="doubleX2_Obs">第二帧观察点X坐标</param> /// <param name="doubleY2_Obs">第二帧观察点Y坐标</param> /// <param name="doubleZ2_Obs">第二帧观察点Z坐标</param> /// <returns></returns> private static IKeyframe CreateMiddleKeyframe(IGlobe pGlobe, double doubleX1_Tar, double doubleY1_Tar, double doubleZ1_Tar, double doubleX1_Obs, double doubleY1_Obs, double doubleZ1_Obs, double doubleX2_Tar, double doubleY2_Tar, double doubleZ2_Tar, double doubleX2_Obs, double doubleY2_Obs, double doubleZ2_Obs) { IUnitConverter unitConverter = new UnitConverterClass(); IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering)pGlobe.GlobeDisplay; IKeyframe pMidKeyframe = new GlobeCameraKeyframeClass(); try { pMidKeyframe.set_PropertyValueInt(0, 0); pMidKeyframe.set_PropertyValueDouble(1, (doubleY1_Tar + doubleY2_Tar) / 2); //doubleY_mid); pMidKeyframe.set_PropertyValueDouble(2, (doubleX1_Tar + doubleX2_Tar) / 2); //doubleX_mid); pMidKeyframe.set_PropertyValueDouble(3, (doubleZ1_Tar + doubleZ2_Tar) / 2); //doubleZ1_Tar/2);//// (globeDisplayRendering.GlobeRadius / -1000)); pMidKeyframe.set_PropertyValueDouble(4, (doubleY1_Obs + doubleY2_Obs) / 2); //doubleY_mid); pMidKeyframe.set_PropertyValueDouble(5, (doubleX1_Obs + doubleX2_Obs) / 2); //doubleX_mid); //改善中间过程用户体验,增加中间点Observer的高度,让高度约等于两点间距离+海拔高度 double doubleAltitide_mid = ReturnProjectDistance(pGlobe, doubleX1_Obs, doubleY1_Obs, doubleZ1_Obs, doubleX2_Obs, doubleY2_Obs, doubleZ2_Obs) / 1000; //KM //加入地表高程 doubleAltitide_mid += GetGlobeElevation(pGlobe.GlobeDisplay, (doubleX1_Obs + doubleX2_Obs) / 2, (doubleY1_Obs + doubleY2_Obs) / 2, true); pMidKeyframe.set_PropertyValueDouble(6, doubleAltitide_mid); pMidKeyframe.set_PropertyValueDouble(7, 30); pMidKeyframe.set_PropertyValueDouble(8, 0); } catch { } return(pMidKeyframe); }
public double getLinearConversion(IProjectedCoordinateSystem prjSys) { IUnitConverter converter = new UnitConverterClass(); ILinearUnit linearUnit = prjSys.CoordinateUnit; double meter = linearUnit.MetersPerUnit; double unitToFoot = converter.ConvertUnits(meter, esriUnits.esriMeters, esriUnits.esriFeet); return(unitToFoot); }
public static double GetGlobeElevation(IGlobeDisplay globeDisplay, double longitude, double latitude, bool maxResolution) { IUnitConverter unitConverter = new UnitConverterClass(); double doubleZ = 0; globeDisplay.GetSurfaceElevation(longitude, latitude, maxResolution, out doubleZ); return(unitConverter.ConvertUnits(doubleZ, esriUnits.esriMeters, globeDisplay.Globe.GlobeUnits)); }
/// <summary> /// Moves points or vertices to coincide exactly with the vertices, edges, or end points of other features. /// Snapping rules can be specified to control whether the input vertices are snapped to the nearest vertex, edge, or /// endpoint within a specified distance /// </summary> /// <param name="source">The input features whose vertices will be snapped to the vertices, edges, or end points of other /// features. The input features can be points, multipoints, lines, or polygons.</param> /// <param name="snap">The features that the input features' vertices will be snapped to. These features can be points, /// multipoints, lines, or polygons.</param> /// <param name="snapType">The type of feature part that the input features' vertices can be snapped to (END | VERTEX | /// EDGE).</param> /// <param name="distance">The distance within which the input features' vertices will be snapped to the nearest vertex, /// edge, or end point.</param> /// <param name="units">The units.</param> /// <param name="trackCancel">The track cancel.</param> /// <param name="eventHandler">The events.</param> public static void Snap(this IFeatureClass source, IFeatureClass snap, SnapType snapType, double distance, esriUnits units, ITrackCancel trackCancel, IGeoProcessorEvents eventHandler) { IUnitConverter converter = new UnitConverterClass(); object row = string.Format("{0} {1} '{2} {3}'", snap.GetAbsolutePath(), snapType.ToString().ToUpperInvariant(), distance, converter.EsriUnitsAsString(units, esriCaseAppearance.esriCaseAppearanceUpper, true)); IGpValueTableObject table = new GpValueTableObjectClass(); table.SetColumns(3); table.AddRow(ref row); source.Snap(table, trackCancel, eventHandler); }
/// <summary> /// Locates the along route implementation. /// </summary> /// <param name="source">The source.</param> /// <param name="locateAlongRouteName">Name of the locate along route.</param> /// <param name="workspace">The workspace.</param> /// <param name="sourceWhereClause">The source where clause.</param> /// <param name="route">The route.</param> /// <param name="routeWhereClause">The route where clause.</param> /// <param name="routeIDFieldName">Name of the route identifier field.</param> /// <param name="radiusOrTolerance">The radius or tolerance.</param> /// <param name="radiusOrToleranceUnits">The radius or tolerance units.</param> /// <param name="searchMultipleLocations">if set to <c>true</c> [search multiple locations].</param> /// <param name="keepAllFields">if set to <c>true</c> [keep all fields].</param> /// <param name="trackCancel">The track cancel.</param> /// <param name="eventHandler">The event handler.</param> /// <returns></returns> private static ITable LocateAlongRouteImpl(IFeatureClass source, string locateAlongRouteName, IWorkspace workspace, string sourceWhereClause, IFeatureClass route, string routeWhereClause, string routeIDFieldName, double radiusOrTolerance, esriUnits radiusOrToleranceUnits, bool searchMultipleLocations, bool keepAllFields, ITrackCancel trackCancel, IGeoProcessorEvents eventHandler) { var ds = (IDataset)source; object input = route; object features = source; if (!string.IsNullOrEmpty(routeWhereClause)) { var name = string.Format("{0}_V", ((IDataset)route).Name); input = route.MakeView(name, routeWhereClause, null, trackCancel, eventHandler); } if (!string.IsNullOrEmpty(sourceWhereClause)) { var name = string.Format("{0}_V", ds.Name); features = source.MakeView(name, sourceWhereClause, null, trackCancel, eventHandler); } LocateFeaturesAlongRoutes gp = new LocateFeaturesAlongRoutes(); gp.in_features = features; gp.in_fields = keepAllFields ? "FIELDS" : "NO_FIELDS"; gp.in_routes = input; gp.route_id_field = routeIDFieldName; gp.out_table = workspace.GetAbsolutePath(locateAlongRouteName); if (source.ShapeType == esriGeometryType.esriGeometryPolyline) { gp.out_event_properties = string.Format("{0} LINE FMEASURE TMEASURE", routeIDFieldName); } else { gp.out_event_properties = string.Format("{0} POINT MEASURE", routeIDFieldName); } IUnitConverter converter = new UnitConverterClass(); gp.radius_or_tolerance = string.Format("{0} {1}", radiusOrTolerance, converter.EsriUnitsAsString(radiusOrToleranceUnits, esriCaseAppearance.esriCaseAppearanceUpper, true)); gp.route_locations = searchMultipleLocations ? "ALL" : "FIRST"; if (gp.Run(trackCancel, eventHandler) == esriJobStatus.esriJobSucceeded) { return(workspace.GetTable(locateAlongRouteName)); } return(null); }
//定位 private void button1_Click(object sender, EventArgs e) { //ESRI.ArcGIS.esriSystem.IUnitConverter unitConverter = (ESRI.ArcGIS.esriSystem.IUnitConverter)ServerContext.CreateObject("esriSystem.UnitConverter"); //project raster //IUnitConverter iu = new esriUnits(); IUnitConverter unitConverter = new UnitConverterClass(); double dFittedBoundsWidthInches = unitConverter.ConvertUnits(-100, esriUnits.esriDecimalDegrees, esriUnits.esriMeters) / 100; double dFittedBoundsWidthInchesy = unitConverter.ConvertUnits(40, esriUnits.esriDecimalDegrees, esriUnits.esriMeters) / 100; //ui.ConvertUnits(10, esriUnits.esriMeters, esriUnits.esriMeters); //IPoint pPoint = new PointClass(); //pPoint.X = -1000; //pPoint.Y = -1000; //IGeometry pGeometry; //pGeometry = (IGeometry)pPoint; //IMarkerSymbol pMarkerSymbol = new SimpleMarkerSymbolClass(); //axMapControl.FlashShape(pGeometry, 4, 100, pMarkerSymbol); IEnvelope pEnvelope = new EnvelopeClass(); IPoint pPoint = new PointClass(); //axMapControl.MapUnits = esriUnits.esriDecimalDegrees; //axMapControl.MapUnits = esriUnits.esriMeters; //米 // esriUnits mapUnits = axMapControl.MapUnits; //axMapControl.MapUnits = esriUnits.esriDecimalDegrees; //pPoint.PutCoords(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text));//该句中的txtlong,txtlat是输入经纬值的TextBox pPoint.X = Convert.ToDouble(textBox1.Text); pPoint.Y = Convert.ToDouble(textBox2.Text); pEnvelope = axMapControl.Extent; pEnvelope.CenterAt(pPoint); axMapControl.Extent = pEnvelope.Envelope; //前一段代码实现平移 axMapControl.ActiveView.ScreenDisplay.UpdateWindow(); axMapControl.FlashShape(pPoint as IGeometry); //此句实现闪烁(效果没有ArcMap中好, ) //axMapControl.ActiveView.Extent = pEnvelope; //showAnnotationByScale(); }
//private void toolCM_Click(object sender, EventArgs e) //{ // this.m_Units = esriUnits.esriCentimeters; //} //private void toolMM_Click(object sender, EventArgs e) //{ // this.m_Units = esriUnits.esriMillimeters; //} #endregion /// <summary> /// guozheng 2011-5-8 added 将量算坐标单位转换为实际要求的单位 /// </summary> /// <param name="in_Len">输入需要转换的数值</param> /// <returns>输出:转换后的数值,内部异常返回-1并记录异常日志</returns> private double UnitConvert(double in_Len) { IUnitConverter pUnitConvert = new UnitConverterClass(); try { double Res = pUnitConvert.ConvertUnits(in_Len, this.m_Displayunit, this.m_Units); return(Res); } catch (Exception eError) { if (SysCommon.Log.Module.SysLog == null) { SysCommon.Log.Module.SysLog = new SysCommon.Log.clsWriteSystemFunctionLog(); } SysCommon.Log.Module.SysLog.Write(eError); return(-1); } }
public int DrawGpsCep(double latitude, double longitude, double[] radii) { if (MxDocument == null) { return(-1); } if (GraphicsLayer == null) { return(-2); } ISpatialReference sr = MxDocument.FocusMap.SpatialReference; if (sr == null || sr is IGeographicCoordinateSystem) { return(-3); } esriUnits mapUnits = MxDocument.FocusMap.MapUnits; if (mapUnits == esriUnits.esriUnknownUnits || mapUnits == esriUnits.esriDecimalDegrees || mapUnits == esriUnits.esriUnitsLast) { return(-3); } IUnitConverter uc = new UnitConverterClass(); var mapRadii = from radius in radii select uc.ConvertUnits(radius, esriUnits.esriMeters, mapUnits); IPoint point = new PointClass(); point.PutCoords(longitude, latitude); point.SpatialReference = Wgs84; point.Project(sr); if (point.IsEmpty) { return(-3); } int id = AddCepGraphic(point, mapRadii.ToList()); return(id); }
private double GetBuffSize() { double dBufferSize = 0; //double.TryParse(this.dblBuffLen.Text, out dblSize); dBufferSize = Convert.ToDouble(dblBuffLen.Text); /*/ 10*/; //20110802 xisheng dBufferSize = dBufferSize < 1 ? 1 : dBufferSize; //设置缓冲值不能设置成0 xisheng 20110722 if (dBufferSize == 0.0) { dBufferSize = 0.001; } //转换如果是经纬度的地图 xisheng 20110731 UnitConverter punitConverter = new UnitConverterClass(); if (m_pMap.MapUnits == esriUnits.esriDecimalDegrees) { dBufferSize = punitConverter.ConvertUnits(dBufferSize, esriUnits.esriMeters, esriUnits.esriDecimalDegrees); }//转换如果是经纬度的地图 xisheng 20110731 return(dBufferSize); }
private void GetArea(ref double area, IMap pMap) { switch (pMap.MapUnits) { case esriUnits.esriKilometers: area = (Math.Abs(area)) * 1000000; break; case esriUnits.esriMeters: case esriUnits.esriUnknownUnits: area = Math.Abs(area); break; case esriUnits.esriDecimalDegrees: //转换如果是经纬度的地图 xisheng 20110731 UnitConverter punitConverter = new UnitConverterClass(); area = punitConverter.ConvertUnits(Math.Abs(area), esriUnits.esriMeters, esriUnits.esriDecimalDegrees); break; default: area = 0; break; } }
/// <summary> /// Converts the unit. /// </summary> /// <param name="dValue">The d value.</param> /// <param name="inUnits">The in units.</param> /// <param name="outUnits">The out units.</param> /// <returns>System.Double.</returns> public static double ConvertUnit(double dValue, esriUnits inUnits, esriUnits outUnits) { IUnitConverter unitConverter = new UnitConverterClass(); return(unitConverter.ConvertUnits(dValue, inUnits, outUnits)); }
public override int Execute(string logfileName) { this.InitLogging(logfileName); this.LogMessage(this.Name + " QA test execution started."); int currentOid = -1; bool bProblemsRunning = false; try { this.LogMessage(this.Name + " Parameters:"); for (int i = 0; i < this.ParameterCount; i++) this.LogMessage(this.get_ParameterText(i) + ": " + this.get_ParameterValue(i)); this.ClearErrors(); int index = this.FindParameter("search-radius"); double searchRadius = Math.Abs((double)((ParameterInfo)this._params[index]).ParamValue); index = this.FindParameter("aspect-ratio-limit"); double aspectRatio = Math.Abs((double)((ParameterInfo)this._params[index]).ParamValue); if (aspectRatio <= 1) { aspectRatio = 10; this.LogMessage("Segment length to distance ratio set under 1.0, using 10 instead."); } index = this.FindParameter(ParameterInfo.PARAM_CANDEFER); bool canDefer = (bool)((ParameterInfo)this._params[index]).ParamValue; index = this.FindParameter(ParameterInfo.PARAM_CANEXCEPT); bool canExcept = (bool)((ParameterInfo)this._params[index]).ParamValue; index = this.FindParameter("limit-neatline-index"); bool limitNeatline = (bool)((ParameterInfo)this._params[index]).ParamValue; // Convert gap limits to metres UnitsParameterInfo theUnits = (UnitsParameterInfo)this._params[this.FindParameter("search-units")]; IUnitConverter theConverter = new UnitConverterClass(); searchRadius = theConverter.ConvertUnits(searchRadius, theUnits.ParamValueInUnits, esriUnits.esriMeters); IFeatureLayer theNeatlineLayer = this.NeatlineLayer; if (theNeatlineLayer == null) { this.LogMessage("Missing valid neatline layer. Exiting Execute."); bProblemsRunning = true; } else { // Create index of neatline segments this.LogMessage("Building neatline index"); // Calc cell size by taking some segment lengths double sum = 0; int segCount = 0; IFeatureCursor theNLCursor = this.NeatlineLayer.Search(null, true); IFeature theNeatline = theNLCursor.NextFeature(); while (theNeatline != null) { IGeometry theGeometry = theNeatline.Shape; theGeometry.Project(SpatialReferenceHelper.BCAlbersSpatialReference); ISegmentCollection theSegColl = (ISegmentCollection)theGeometry; for (int i = 0; i < theSegColl.SegmentCount; i++) { sum += theSegColl.get_Segment(i).Length; segCount++; } theNeatline = theNLCursor.NextFeature(); if (segCount > 100) break; } Marshal.ReleaseComObject(theNLCursor); theNLCursor = null; double cellsize = (sum / segCount) * 5; this.LogMessage("Cellsize: (" + sum + " / " + segCount + ") = " + cellsize); // Determine the bounding env for the features to analyze // If this is significantly smaller than the bounds of the neatline // layer, this will save time building the cache ISpatialFilter theSF = null; if (limitNeatline) { IEnvelope theAOI = null; for (int layerIdx = 0; layerIdx < this.LayerCount; layerIdx++) { IFeatureLayer theFLayer = this.get_Layer(layerIdx); IFeatureClass theFClass = theFLayer.FeatureClass; if (theFLayer != theNeatlineLayer && this.SupportsGeometryType(theFClass.ShapeType)) { if (this.ConstrainToSelection) { IFeatureCursor theFCursor; ICursor theCursor; IFeatureSelection theFSel = (IFeatureSelection)theFLayer; theFSel.SelectionSet.Search(null, true, out theCursor); theFCursor = (IFeatureCursor)theCursor; IFeature theFeature = theFCursor.NextFeature(); while (theFeature != null) { if (theFeature.Shape != null && theFeature.Shape.IsEmpty == false) { if (theAOI != null) theAOI.Union(theFeature.Shape.Envelope); else theAOI = theFeature.Shape.Envelope; } theFeature = theFCursor.NextFeature(); } Marshal.ReleaseComObject(theFCursor); } else { if (theAOI != null) theAOI.Union(theFLayer.AreaOfInterest); else theAOI = theFLayer.AreaOfInterest; } } } theSF = new SpatialFilterClass(); theSF.Geometry = theAOI; theSF.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; } SegmentCollectionIndex theIndex = new SegmentCollectionIndex(cellsize); theNLCursor = this.NeatlineLayer.Search(theSF, true); theNeatline = theNLCursor.NextFeature(); while (theNeatline != null) { ISegmentCollection theSegColl = theNeatline.Shape as ISegmentCollection; for (int i = 0; i < theSegColl.SegmentCount; i++) { IndexSegment theSegment = new IndexSegment(theNeatline.OID, theSegColl.get_Segment(i)); theIndex.AddSegment(theSegment); } theNeatline = theNLCursor.NextFeature(); } for (int layerIdx = 0; layerIdx < this.LayerCount; layerIdx++) { IFeatureLayer theFLayer = this.get_Layer(layerIdx); IFeatureClass theFClass = theFLayer.FeatureClass; IDataset theDataset = (IDataset)theFClass; if (theFLayer != theNeatlineLayer && this.SupportsGeometryType(theFClass.ShapeType)) { this.LogMessage("Detecting neatline artifacts in featureclass " + theDataset.Name); int nFeatures = 0; IFeatureCursor theFCursor = null; IFeatureSelection theFSel = (IFeatureSelection)theFLayer; if (this.ConstrainToSelection) { this.LogMessage("Constraining analysis to selected features."); ICursor theCursor; theFSel.SelectionSet.Search(null, true, out theCursor); theFCursor = (IFeatureCursor)theCursor; nFeatures = theFSel.SelectionSet.Count; } else { theFCursor = theFClass.Search(null, true); nFeatures = theFClass.FeatureCount(null); } this.LogMessage("Number of features to process: " + nFeatures); int count = 0; int countIncrement = Math.Max(1, nFeatures / 10); IFeature theFeature = theFCursor.NextFeature(); while (theFeature != null) { if (theFeature.HasOID) currentOid = theFeature.OID; // for error trapping and debugging ArrayList theList = this.ProcessFeature(theFeature, theIndex, searchRadius, aspectRatio, canDefer, canExcept); if (theList != null) { foreach (DataQualityError dqe in theList) this._errors.Add(dqe); } if (++count % countIncrement == 0) { this.LogMessage("Processed " + count + " polygons..."); } theFeature = theFCursor.NextFeature(); } Marshal.ReleaseComObject(theFCursor); } } } this.LogMessage("Number of errors found: " + this.ErrorCount); this.LogMessage("Test " + this.Name + " successful."); } catch (Exception ex) { this.LogMessage("Exception caught: \n" + ex.Message + "\n" + ex.StackTrace.ToString()); this.LogMessage("id of the current polygon: " + currentOid); return -1; } finally { this.StopLogging(); } if (bProblemsRunning) return -1; return this.ErrorCount; }
/// <summary> /// 将输入的数据单位转化为米 /// </summary> /// <param name="dValue"></param> /// <param name="outUnits"></param> /// <returns></returns> public double UnitsConvertToMeters(double dValue,esriUnits outUnits) { IUnitConverter unitConverter = new UnitConverterClass(); double newValue = unitConverter.ConvertUnits(dValue, esriUnits.esriMeters, outUnits); return newValue; }
public static IAnimationTrack CreateZoomOverLocationAnimation(IGlobeDisplay globeDisplay, double doubleX, double doubleY, double doubleAltitide) { // Set Mouse Cursor //IMouseCursor mouseCursor = new MouseCursorClass(); //mouseCursor.SetCursor(2); // QI to GlobeDisplayRendering Interface IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering) globeDisplay; // Get Elevation Multiplication Factor IUnitConverter unitConverter = new UnitConverterClass(); // Get GlobeDisplay and Camera IGlobe globe = globeDisplay.Globe; IAnimationTracks animationTracks = (IAnimationTracks)globe; IGlobeCamera globeCamera = (IGlobeCamera)globeDisplay.ActiveViewer.Camera; // Create New Animation Track IAnimationTrack animationTrack = new AnimationTrackClass(); try { IAnimationType animationType = new AnimationTypeGlobeCameraClass(); animationTrack.AnimationType = animationType; // Create First KeyFrame At Current Location IKeyframe keyframe1 = new GlobeCameraKeyframeClass(); keyframe1.CaptureProperties((IScene)globe, globeCamera); animationTrack.InsertKeyframe(keyframe1, animationTrack.KeyframeCount); // Create Last KeyFrame Over Desired Location IKeyframe keyframe3 = new GlobeCameraKeyframeClass(); keyframe3.set_PropertyValueInt(0, 0); keyframe3.set_PropertyValueDouble(1, doubleY); keyframe3.set_PropertyValueDouble(2, doubleX); keyframe3.set_PropertyValueDouble(3, -1d * unitConverter.ConvertUnits(globeDisplayRendering.GlobeRadius, esriUnits.esriMeters, globe.GlobeUnits)); // (globeDisplayRendering.GlobeRadius / -1000)); keyframe3.set_PropertyValueDouble(4, doubleY); keyframe3.set_PropertyValueDouble(5, doubleX); keyframe3.set_PropertyValueDouble(6, doubleAltitide); keyframe3.set_PropertyValueDouble(7, 30); keyframe3.set_PropertyValueDouble(8, 0); #region 获取第一帧和第三帧的参数 double dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs; GetParametersFromKeyFrame(keyframe1, out dX1_Tar, out dY1_Tar, out dZ1_Tar, out dX1_Obs, out dY1_Obs, out dZ1_Obs); double dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs; GetParametersFromKeyFrame(keyframe3, out dX3_Tar, out dY3_Tar, out dZ3_Tar, out dX3_Obs, out dY3_Obs, out dZ3_Obs); #endregion ////=========================================== 创建中间帧 == == == == == == == == == == == == == == == == == == == == == = IKeyframe keyframe2 = CreateMiddleKeyframe(globeDisplay.Globe, dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs, dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs); //头晕、高血压、糖尿病患者调用该函数请慎重! //=========================================== 创建中间帧 == == == == == == == == == == == == == == == == == == == == == = //animationTrack.InsertKeyframe(keyframe2, animationTrack.KeyframeCount); animationTrack.InsertKeyframe(keyframe3, animationTrack.KeyframeCount); // Set The Animation Track Name animationTrack.Name = "Zoom Over Location"; // Set Track Attachments animationTrack.AttachObject(globeCamera); animationTrack.ApplyToAllViewers = true; // Add The New Track To The Scene animationTracks.AddTrack(animationTrack); // Return The Newly Create Aninmation Track } catch { } return animationTrack; }
public override int Execute(string logfileName) { this.InitLogging(logfileName); this.LogMessage(this.Name + " QA test execution started."); int currentOid = -1; try { this.LogMessage(this.Name + " Parameters:"); for (int i = 0; i < this.ParameterCount; i++) this.LogMessage(this.get_ParameterText(i) + ": " + this.get_ParameterValue(i)); this.ClearErrors(); // Check the search radius int idx = this.FindParameter("search-radius"); DoubleParameterInfo theInfo = (DoubleParameterInfo)this._params[idx]; double theSearchRadius = (double)theInfo.ParamValue; if (theSearchRadius <= 0) { this.LogMessage("Zero or negative value passed as search radius for " + this.Name + ". Stopping."); return -1; } // Check the cluster tolerance idx = this.FindParameter("cluster-tolerance"); theInfo = (DoubleParameterInfo)this._params[idx]; double theCluster = (double)theInfo.ParamValue; if (theCluster >= theSearchRadius) { this.LogMessage("Cluster tolerance equal to or larger than search radius for " + this.Name + ". Stopping."); return -1; } // Convert them to metres idx = this.FindParameter("search-units"); UnitsParameterInfo theUnitsParam = (UnitsParameterInfo)this._params[idx]; esriUnits theUnits = theUnitsParam.ParamValueInUnits; IUnitConverter theConverter = new UnitConverterClass(); theSearchRadius = theConverter.ConvertUnits(theSearchRadius, theUnits, esriUnits.esriMeters); theCluster = theConverter.ConvertUnits(theCluster, theUnits, esriUnits.esriMeters); // Get the canDefer/canExcept params idx = this.FindParameter(ParameterInfo.PARAM_CANDEFER); bool canDefer = (bool)((ParameterInfo)this._params[idx]).ParamValue; idx = this.FindParameter(ParameterInfo.PARAM_CANEXCEPT); bool canExcept = (bool)((ParameterInfo)this._params[idx]).ParamValue; // Loop through the layers for (int i = 0; i < this.LayerCount - 1; i++) { IFeatureLayer theLayer1 = this.get_Layer(i); if (this.SupportsGeometryType(theLayer1.FeatureClass.ShapeType) == false) continue; // Index the points in theLayer1 IDataset theDataset1 = (IDataset)theLayer1.FeatureClass; IGeoDataset theGeoDS = (IGeoDataset)theDataset1; IEnvelope theAOI = theGeoDS.Extent; if (theAOI == null || theAOI.IsEmpty) continue; theAOI.Project(SpatialReferenceHelper.BCAlbersSpatialReference); double theCellsize = theAOI.Width / 100; this.LogMessage("Indexing features in " + theDataset1.Name + ". Cellsize (m): " + theCellsize); PointCollectionIndex theIndex = new PointCollectionIndex(theCellsize); IFeatureCursor theFCursor1 = null; if (this.ConstrainToSelection) { ICursor theCursor = null; IFeatureSelection theFSel = (IFeatureSelection)theLayer1; theFSel.SelectionSet.Search(null, true, out theCursor); theFCursor1 = (IFeatureCursor)theCursor; } else { theFCursor1 = theLayer1.Search(null, true); } IFeature theFeature1 = theFCursor1.NextFeature(); while (theFeature1 != null) { if (theFeature1.Shape != null && theFeature1.Shape.IsEmpty == false) { IPointCollection thePtColl = (IPointCollection)theFeature1.Shape; for (int k = 0; k < thePtColl.PointCount; k++) { theIndex.AddPoint(new IndexPoint(theFeature1.OID, k, thePtColl.get_Point(k))); } } theFeature1 = theFCursor1.NextFeature(); } // Release the cursor Marshal.ReleaseComObject(theFCursor1); theFCursor1 = null; if (theIndex.PointCount > 0) { // Use the index to analyze the other layers for (int j = i+1; j < this.LayerCount; j++) { IFeatureLayer theLayer2 = this.get_Layer(j); if (this.SupportsGeometryType(theLayer2.FeatureClass.ShapeType) == false) continue; IDataset theDataset2 = (IDataset)theLayer2.FeatureClass; IFeatureCursor theFCursor2 = null; if (this.ConstrainToSelection) { ICursor theCursor = null; IFeatureSelection theFSel = (IFeatureSelection)theLayer2; theFSel.SelectionSet.Search(null, true, out theCursor); theFCursor2 = (IFeatureCursor)theCursor; } else { theFCursor2 = theLayer2.Search(null, true); } IFeature theFeature2 = theFCursor2.NextFeature(); while (theFeature2 != null) { if (theFeature2.Shape != null && theFeature2.Shape.IsEmpty == false) { IGeometry theCopy = theFeature2.ShapeCopy; theCopy.Project(SpatialReferenceHelper.BCAlbersSpatialReference); IPointCollection thePtColl = (IPointCollection)theCopy; for (int k = 0; k < thePtColl.PointCount; k++) { // Find the closest point in the index. If it's less than // the search radius and larger than the cluster tolerance, // log as an error IPoint thePoint = thePtColl.get_Point(k); IndexPoint theIdxPoint = theIndex.get_ClosestPointWithinLimits( thePoint.X, thePoint.Y, theCluster, theSearchRadius); if (theIdxPoint != null) { // Build a straight line between the offending points IPolyline thePolyline = new PolylineClass(); thePolyline.Project(SpatialReferenceHelper.BCAlbersSpatialReference); ((IPointCollection)thePolyline).AddPoint(thePoint, ref this._missing, ref this._missing); IPoint theOtherPoint = new PointClass(); theOtherPoint.Project(SpatialReferenceHelper.BCAlbersSpatialReference); theOtherPoint.PutCoords(theIdxPoint.X, theIdxPoint.Y); ((IPointCollection)thePolyline).AddPoint(theOtherPoint, ref this._missing, ref this._missing); // Get the distance double dist = PointCollectionIndex.get_Distance(thePoint.X, thePoint.Y, theOtherPoint.X, theOtherPoint.Y); // Project to geographics for error reporting thePolyline.Project(SpatialReferenceHelper.GeographicReference); // Error point will be 1/2 way along line between points IPoint theErrorPoint = new PointClass(); thePolyline.QueryPoint(esriSegmentExtension.esriNoExtension, 0.5, true, theErrorPoint); DataQualityError theError = new DataQualityError(this.Name, canDefer, canExcept); theError.Location = theErrorPoint; // If it's in the smallest 10% of the search radius, mark high severity // 50%, medium if (dist <= theSearchRadius / 10) theError.Severity = 1; else if (dist <= theSearchRadius / 2) theError.Severity = 2; else theError.Severity = 3; theError.Description = "Points almost but not quite co-located"; ExtendedInfo theExtInfo = new ExtendedInfo(); theExtInfo.AddProperty("Feature class 1", theDataset1.Name); theExtInfo.AddProperty("Feature class 2", theDataset2.Name); if (theLayer1.FeatureClass.HasOID) theExtInfo.AddProperty("Feature ID 1", theIdxPoint.SourceFeatureID.ToString()); if (theLayer2.FeatureClass.HasOID) theExtInfo.AddProperty("Feature ID 2", theFeature2.OID.ToString()); theExtInfo.AddProperty("Distance", String.Format("{0:0.## metres}", dist)); theExtInfo.AddProperty("From point x", thePolyline.FromPoint.X.ToString()); theExtInfo.AddProperty("From point y", thePolyline.FromPoint.Y.ToString()); theExtInfo.AddProperty("To point x", thePolyline.ToPoint.X.ToString()); theExtInfo.AddProperty("To point y", thePolyline.ToPoint.Y.ToString()); theError.ExtendedData = theExtInfo.WriteXML(); //this.LogMessage(theError.ExtendedData); this._errors.Add(theError); } } } theFeature2 = theFCursor2.NextFeature(); } } } } this.LogMessage("Number of errors found: " + this.ErrorCount); this.LogMessage("Test " + this.Name + " successful."); } catch (Exception ex) { this.LogMessage("Exception caught: \n" + ex.Message + "\n" + ex.StackTrace.ToString()); this.LogMessage("id of the current polygon: " + currentOid); return -1; } finally { this.StopLogging(); } return this.ErrorCount; }
public override int Execute(string logfileName) { this.InitLogging(logfileName); this.LogMessage(this.Name + " QA test execution started."); int currentOid = -1; bool bProblemsRunning = false; try { this.LogMessage(this.Name + " Parameters:"); for (int i = 0; i < this.ParameterCount; i++) this.LogMessage(this.get_ParameterText(i) + ": " + this.get_ParameterValue(i)); this.ClearErrors(); int index = this.FindParameter(ParameterInfo.PARAM_CANDEFER); bool canDefer = (bool)((ParameterInfo)this._params[index]).ParamValue; index = this.FindParameter(ParameterInfo.PARAM_CANEXCEPT); bool canExcept = (bool)((ParameterInfo)this._params[index]).ParamValue; if (canDefer || canExcept) { this.LogMessage("Errors found by " + this.Name + " cannot be deferred or excepted."); } IFeatureLayer theSeeLayer = this.SEELayer; if (theSeeLayer == null) { this.LogMessage("Missing SEE layer. Exiting Execute."); bProblemsRunning = true; } else if (this._eDao == null) { this.LogMessage("Missing Edits Data Access Object. Exiting Execute."); bProblemsRunning = true; } //else if (this._tmConfig == null) //{ // this.LogMessage("Missing Transaction Config object. Exiting Execute."); // bProblemsRunning = true; //} else { // Select the SEE polygon string theTxID = this.TxID; IQueryFilter theQF = new QueryFilterClass(); theQF.WhereClause = SEE_ID_FIELD_NAME + " = '" + theTxID + "'"; IFeatureCursor theFCursor = theSeeLayer.Search(theQF, false); IFeature theSee = theFCursor.NextFeature(); Marshal.ReleaseComObject(theFCursor); theFCursor = null; if (theSee == null) { this.LogMessage("Could not find SEE feature with id " + theTxID + ". Exiting Execute."); bProblemsRunning = true; } else if (theSee.Shape == null || theSee.Shape.IsEmpty) { this.LogMessage("The SEE feature with id " + theTxID + " does not have a valid shape. Exiting Execute."); bProblemsRunning = true; } else { ISegmentCollection theSColl = (ISegmentCollection)this.ShapeCopy(theSee); IPolygon theSeeBounds = new PolygonClass(); ((ISegmentCollection)theSeeBounds).AddSegmentCollection(theSColl); theSeeBounds.Close(); // Convert shift limit to metres DoubleParameterInfo theParam = (DoubleParameterInfo)this._params[this.FindParameter("ignore-shift-smaller-than")]; double shiftLimit = (double)theParam.ParamValue; UnitsParameterInfo theUnits = (UnitsParameterInfo)this._params[this.FindParameter("shift-units")]; IUnitConverter theConverter = new UnitConverterClass(); shiftLimit = theConverter.ConvertUnits(shiftLimit, theUnits.ParamValueInUnits, esriUnits.esriMeters); for (int i = 0; i < this.LayerCount; i++) { IFeatureLayer theFLayer = this.get_Layer(i); if (this.SupportsGeometryType(theFLayer.FeatureClass.ShapeType) == false) { this.LogMessage("Geometry type " + theFLayer.FeatureClass.ShapeType + " of layer " + theFLayer.Name + " not supported by " + this.Name); continue; } if (theFLayer == theSeeLayer) continue; string theLayerKey = ((IDataset)theFLayer.FeatureClass).Name; if (theLayerKey == null) { this.LogMessage("Could not find TM layer key for layer " + theFLayer.Name + " passed to " + this.Name); bProblemsRunning = true; break; } IFeatureClass theEditsFC = this.SiblingFClassWithName(i, "E_" + theLayerKey); if (theEditsFC == null) this.LogMessage("Could not find TM edits featureclass for layer " + theFLayer.Name + " passed to " + this.Name); IFeatureClass thePristineFC = this.SiblingFClassWithName(i, "P_" + theLayerKey); if (thePristineFC == null) this.LogMessage("Could not find TM pristine featureclass for layer " + theFLayer.Name + " passed to " + this.Name); if (theEditsFC == null || thePristineFC == null) { bProblemsRunning = true; break; } if (this.ProcessLayer(theLayerKey, theFLayer.FeatureClass, theEditsFC, thePristineFC, theSeeBounds, shiftLimit) == false) { bProblemsRunning = true; break; } } } } this.LogMessage("Number of errors found: " + this.ErrorCount); if (!bProblemsRunning) this.LogMessage("Test " + this.Name + " successful."); } catch (Exception ex) { this.LogMessage("Exception caught: \n" + ex.Message + "\n" + ex.StackTrace.ToString()); this.LogMessage("id of the current polygon: " + currentOid); return -1; } finally { this.StopLogging(); } if (bProblemsRunning) return -1; return this.ErrorCount; }
private void MapUserIdentify(double mapX, double mapY) { try { //axMapControl1.Map.ClearSelection(); ESRI.ArcGIS.Controls.IMapControl3 m_mapControl = (IMapControl3)axMapControl1.Object; IMap pMap = axMapControl1.Map; IGroupLayer pGroupLayer = new GroupLayer(); if (pMap.LayerCount == 0) { return; } IEnumLayer pEnumLayer; ILayer pLayer; pEnumLayer = pMap.get_Layers(null, true); if (pEnumLayer == null) { return; } pEnumLayer.Reset(); double dCurrScale = m_mapControl.MapScale; for (pLayer = pEnumLayer.Next(); pLayer != null; pLayer = pEnumLayer.Next()) { if (pLayer.Visible) { if (pLayer is IGroupLayer) { continue; } if (pLayer.MinimumScale != 0 && dCurrScale > pLayer.MinimumScale) { continue; } if (pLayer.MaximumScale != 0 && dCurrScale < pLayer.MaximumScale) { continue; } pGroupLayer.Add(pLayer); } } IPoint pPoint = new ESRI.ArcGIS.Geometry.Point(); pPoint.X = mapX; pPoint.Y = mapY; IIdentifyObj pIdObj; IIdentify pIdentify = pGroupLayer as IIdentify; IArray pIDArray; IFeatureIdentifyObj pFeatIdObj; IEnvelope pEnv = pPoint.Envelope; IDisplayTransformation pDT = m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation; pEnv.Expand(pDT.VisibleBounds.Width / 200, pDT.VisibleBounds.Height / 200, false); pIDArray = pIdentify.Identify(pEnv); if (pIDArray == null || pIDArray.Count == 0) { return; } pFeatIdObj = pIDArray.get_Element(0) as IFeatureIdentifyObj; pIdObj = pFeatIdObj as IIdentifyObj; IRowIdentifyObject pRowIdentifyObj = pFeatIdObj as IRowIdentifyObject; IFeature pFeature = pRowIdentifyObj.Row as IFeature; if (pFeature != null && pFeature.Shape != null && !pFeature.Shape.IsEmpty) { //axMapControl1.FlashShape(pFeature.Shape); axMapControl1.Map.SelectFeature(pIdObj.Layer, pFeature); FlashFeature(axMapControl1, pFeature.Shape); } // pIdObj.Flash(m_mapControl.ActiveView.ScreenDisplay);//The Flash method is not supported with ArcGIS Engine, use the IHookActions.DoActions() method with the esriHookActionsFlash for this functionality. ILayer pIdentiyLayer = pIdObj.Layer; DataTable pTable = new DataTable(); DataColumn pDataColumn = pTable.Columns.Add(); pDataColumn.ColumnName = "列名"; pDataColumn = pTable.Columns.Add(); pDataColumn.ColumnName = "值"; DataRow pFirestDataRow = pTable.Rows.Add(); pFirestDataRow[0] = "所在层"; pFirestDataRow[1] = pIdentiyLayer.Name; if (pIdentiyLayer is IFeatureLayer) { IRowIdentifyObject pRowObj = pIdObj as IRowIdentifyObject; // IRow pRow = pRowObj.Row; IFeature pRow = pRowObj.Row as IFeature; IFields pFields = pRow.Fields; for (int i = 0; i < pFields.FieldCount; i++) { IField pField = pFields.get_Field(i); DataRow pDataRow = null; /* * switch (pField.Type) * { * case esriFieldType.esriFieldTypeOID: * pDataRow = pTable.Rows.Add(); * pDataRow[0] = pField.Name; * pDataRow[1] = pRow.OID.ToString(); * break; * case esriFieldType.esriFieldTypeGeometry: * //pDataRow[0] = "Geometry"; * //pDataRow[1] = QueryShapeType(pField.GeometryDef.GeometryType);; * break; * default: * pDataRow = pTable.Rows.Add(); * pDataRow[0] = pField.Name; * pDataRow[1] = pRow.get_Value(i).ToString(); * break; * } * * */ ////////////////////////////////////////////////// string sValue = pRow.get_Value(i).ToString(); string strFName = pField.AliasName.ToUpper(); string strUName = strFName.ToUpper(); if (strUName == "SHAPE" || strUName == "LENGTH" || strUName == "OBJECTID" || strUName == "ID" || strUName == "FNODE_" || strUName == "TNODE_" || strUName == "LPOLY_" || strUName == "RPOLY_" || strUName == "SDXL_" || strUName == "SDXL_ID" || strUName == "OBJECTID_1" || strUName == "FID") { continue; } else if (strUName == "SHAPE.LEN" || strUName == "SHAPE_LENG") { strFName = "几何长度"; } else if (strUName == "SHAPE_AREA" || strUName == "SHAPE.AREA") { strFName = "多边形面积"; } else if (strUName == "HEIGHT") { strFName = "高程"; } else if (strUName == "NAME") { strFName = "名称"; } else if (strUName == "TYPE") { strFName = "类型"; } else if (strUName == "SUBTYPE") { strFName = "子类型"; } if (strUName == "LENGTH" || strUName == "SHAPE.LEN") { IUnitConverter myUnit = new UnitConverterClass(); sValue = Math.Round(myUnit.ConvertUnits((double)pRow.get_Value(i), esriUnits.esriMeters, esriUnits.esriKilometers), 2).ToString(); sValue = sValue.ToString() + "千米"; } if (strUName == "SHAPE_AREA" || strUName == "SHAPE.AREA") { IGeometry pGeo = pRow.ShapeCopy; pGeo.Project(axMapControl1.Map.SpatialReference); IPolygon pPolygon = (IPolygon)pGeo; IArea pArea = (IArea)pPolygon; double strValue = pArea.Area * 0.000001; //// double strValue = Math.Abs((double)pFeature.get_Value(j)) * 10585; strValue = Math.Round(strValue, 2); sValue = strValue.ToString() + "平方千米"; } esriFieldType tFieldTypy = pField.Type; if (tFieldTypy == esriFieldType.esriFieldTypeGeometry) { sValue = pField.GeometryDef.GeometryType.ToString(); sValue = sValue.Substring(12, sValue.Length - 12); } pDataRow = pTable.Rows.Add(); pDataRow[0] = strFName; pDataRow[1] = sValue; ////////////////////////////////////////////////// } } else if (pIdentiyLayer is ITinLayer) { ITinLayer pTinLayer = (ITinLayer)pIdentiyLayer; ITinSurface pTinSurface = (ITinSurface)pTinLayer.Dataset; if (pTinSurface == null) { return; } ITinSurfaceElement pTinSurfaceElement = pTinSurface.GetSurfaceElement(pPoint); if (pTinSurfaceElement == null) { return; } IFields pFields = pTinLayer.Dataset.Fields; DataRow pDataRow = null; pDataRow = pTable.Rows.Add(); pDataRow[0] = "高度"; pDataRow[1] = pTinSurfaceElement.Elevation.ToString(); pDataRow = pTable.Rows.Add(); pDataRow[0] = "坡度"; pDataRow[1] = pTinSurfaceElement.SlopeDegrees.ToString(); pDataRow = pTable.Rows.Add(); pDataRow[0] = "方向"; pDataRow[1] = pTinSurfaceElement.AspectDegrees.ToString(); } if (pIdentiyLayer is IRasterLayer) { MessageBox.Show("aa"); } //ShowIndetify(pTable); //m_pMainform.ShowIndetify(pTable); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } }
public override int Execute(string logfileName) { this.InitLogging(logfileName); this.LogMessage(this.Name + " QA test execution started."); bool bProblemsRunning = false; int currentOid = -1; try { this.LogMessage(this.Name + " Parameters:"); for (int i = 0; i < this.ParameterCount; i++) this.LogMessage(this.get_ParameterText(i) + ": " + this.get_ParameterValue(i)); this.ClearErrors(); for (int layerIdx = 0; layerIdx < this.LayerCount; layerIdx++) { IFeatureLayer theFLayer = this.get_Layer(layerIdx); IFeatureClass theFClass = theFLayer.FeatureClass; IDataset theDataset = (IDataset)theFClass; if (!this.SupportsGeometryType(theFClass.ShapeType)) { this.LogMessage("Gap detector does not support the geometry type in featureclass " + theDataset.Name); bProblemsRunning = true; } else if (theFClass.FeatureDataset == null) { this.LogMessage("Featureclass " + theDataset.Name + " is not in a feature dataset"); bProblemsRunning = true; } else { this.LogMessage("Looking for topology with gap rule including featureclass " + theDataset.Name); ITopology theTopology = null; ArrayList theTRules = new ArrayList(); ITopologyRule theTopoRule = null; IEnumDataset theDatasetEnum = theFClass.FeatureDataset.Subsets; IDataset theSiblingDS = theDatasetEnum.Next(); while (theSiblingDS != null) { if (theSiblingDS.Type == esriDatasetType.esriDTTopology) { // Look for a gap rule featuring theFClass theTopology = (ITopology)theSiblingDS; ITopologyRuleContainer theTRContainer = (ITopologyRuleContainer)theTopology; IEnumRule theRules = theTRContainer.get_RulesByClass(theFClass.FeatureClassID); theTopoRule = (ITopologyRule)theRules.Next(); while (theTopoRule != null) { if (theTopoRule.TopologyRuleType == esriTopologyRuleType.esriTRTAreaNoGaps) theTRules.Add(theTopoRule); theTopoRule = (ITopologyRule)theRules.Next(); } } theSiblingDS = theDatasetEnum.Next(); } if (theTopology == null || theTRules.Count == 0) { this.LogMessage("Featureclass " + theDataset.Name + " is not part of a Gap topology rule"); bProblemsRunning = true; continue; } if (this.ValidateTopology(theTopology) == false) { this.LogMessage("The topology " + ((IDataset)theTopology).Name + " could not be validated"); bProblemsRunning = true; continue; } if (theTopology.State == esriTopologyState.esriTSAnalyzedWithErrors) { this.LogMessage("Indexing gap errors in featureclass " + theDataset.Name + " as it relates to Topology " + ((IDataset)theTopology).Name); IErrorFeatureContainer theTopoErrorContainer = (IErrorFeatureContainer)theTopology; int count = 0; int countIncrement = 500; DoubleParameterInfo theParam = (DoubleParameterInfo)this._params[this.FindParameter("ignore-gap-larger-than")]; double maxGap = (double)theParam.ParamValue; theParam = (DoubleParameterInfo)this._params[this.FindParameter("ignore-gap-smaller-than")]; double minGap = (double)theParam.ParamValue; // Convert gap limits to metres UnitsParameterInfo theUnits = (UnitsParameterInfo)this._params[this.FindParameter("gap-units")]; IUnitConverter theConverter = new UnitConverterClass(); maxGap = theConverter.ConvertUnits(maxGap, theUnits.ParamValueInUnits, esriUnits.esriMeters); minGap = theConverter.ConvertUnits(minGap, theUnits.ParamValueInUnits, esriUnits.esriMeters); for (int j = 0; j < theTRules.Count; j++) { theTopoRule = (ITopologyRule)theTRules[j]; this.LogMessage("Processing rule " + (j+1) + " of " + theTRules.Count); double cellsize = maxGap * 5; PointCollectionIndex theIndex = new PointCollectionIndex(cellsize); IGeoDataset theGeoDS = (IGeoDataset)theTopology; IEnumTopologyErrorFeature theTopoErrors = theTopoErrorContainer.get_ErrorFeatures(theGeoDS.SpatialReference, theTopoRule, null, true, false); ITopologyErrorFeature theTopoErrorFeature = theTopoErrors.Next(); while (theTopoErrorFeature != null) { currentOid = theTopoErrorFeature.ErrorID; IPointCollection thePtColl = (IPointCollection)((IFeature)theTopoErrorFeature).Shape; for (int i = 0; i < thePtColl.PointCount; i++) { // ErrorID the same as ObjectID on the error feature theIndex.AddPoint(new IndexPoint(theTopoErrorFeature.ErrorID, i, thePtColl.get_Point(i))); } if (++count % countIncrement == 0) { this.LogMessage("Indexed " + count + " topology errors..."); } theTopoErrorFeature = theTopoErrors.Next(); } this.LogMessage("Getting pairs of points within tolerances..."); ArrayList theResults = theIndex.PointPairsWithinLimits(minGap, maxGap); this.LogMessage(theResults.Count + " pairs of points found within gap tolerances. Checking."); // Get info from the params int index = this.FindParameter("angle-tolerance-degrees"); theParam = (DoubleParameterInfo)this._params[index]; double theLimitRadians = Math.PI * (double)theParam.ParamValue / 180; index = this.FindParameter("eliminate-pinches"); bool allowPinches = !(bool)((ParameterInfo)this._params[index]).ParamValue; ArrayList theList = this.ProcessPotentialGapErrors(theResults, theTopology, theFClass, theLimitRadians, allowPinches); if (theList != null) { index = this.FindParameter(ParameterInfo.PARAM_CANDEFER); bool canDefer = (bool)((ParameterInfo)this._params[index]).ParamValue; index = this.FindParameter(ParameterInfo.PARAM_CANEXCEPT); bool canExcept = (bool)((ParameterInfo)this._params[index]).ParamValue; theList = this.WeedErrors(theList, canDefer, canExcept, minGap, maxGap); } if (theList != null) { foreach (DataQualityError dqe in theList) this._errors.Add(dqe); } } } else { this.LogMessage("Topology has no errors"); } } } this.LogMessage("Number of errors found: " + this.ErrorCount); this.LogMessage("Test " + this.Name + " successful."); } catch (Exception ex) { this.LogMessage("Exception caught: \n" + ex.Message + "\n" + ex.StackTrace.ToString()); this.LogMessage("id of the current polygon: " + currentOid); return -1; } finally { this.StopLogging(); } if (bProblemsRunning) return -1; return this.ErrorCount; }
public static IAnimationTrack CreateZoomOverLocationAnimation(IGlobeDisplay globeDisplay, double doubleX, double doubleY, double doubleAltitide) { // Set Mouse Cursor //IMouseCursor mouseCursor = new MouseCursorClass(); //mouseCursor.SetCursor(2); // QI to GlobeDisplayRendering Interface IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering) globeDisplay; // Get Elevation Multiplication Factor IUnitConverter unitConverter = new UnitConverterClass(); // Get GlobeDisplay and Camera IGlobe globe = globeDisplay.Globe; IAnimationTracks animationTracks = (IAnimationTracks)globe; IGlobeCamera globeCamera = (IGlobeCamera)globeDisplay.ActiveViewer.Camera; // Create New Animation Track IAnimationTrack animationTrack = new AnimationTrackClass(); try { IAnimationType animationType = new AnimationTypeGlobeCameraClass(); animationTrack.AnimationType = animationType; // Create First KeyFrame At Current Location IKeyframe keyframe1 = new GlobeCameraKeyframeClass(); keyframe1.CaptureProperties((IScene)globe, globeCamera); animationTrack.InsertKeyframe(keyframe1, animationTrack.KeyframeCount); // Create Last KeyFrame Over Desired Location IKeyframe keyframe3 = new GlobeCameraKeyframeClass(); keyframe3.set_PropertyValueInt(0, 0); keyframe3.set_PropertyValueDouble(1, doubleY); keyframe3.set_PropertyValueDouble(2, doubleX); keyframe3.set_PropertyValueDouble(3, -1d * unitConverter.ConvertUnits(globeDisplayRendering.GlobeRadius, esriUnits.esriMeters, globe.GlobeUnits)); // (globeDisplayRendering.GlobeRadius / -1000)); keyframe3.set_PropertyValueDouble(4, doubleY); keyframe3.set_PropertyValueDouble(5, doubleX); keyframe3.set_PropertyValueDouble(6, doubleAltitide); keyframe3.set_PropertyValueDouble(7, 30); keyframe3.set_PropertyValueDouble(8, 0); #region 获取第一帧和第三帧的参数 double dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs; GetParametersFromKeyFrame(keyframe1, out dX1_Tar, out dY1_Tar, out dZ1_Tar, out dX1_Obs, out dY1_Obs, out dZ1_Obs); double dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs; GetParametersFromKeyFrame(keyframe3, out dX3_Tar, out dY3_Tar, out dZ3_Tar, out dX3_Obs, out dY3_Obs, out dZ3_Obs); #endregion ////=========================================== 创建中间帧 == == == == == == == == == == == == == == == == == == == == == = IKeyframe keyframe2 = CreateMiddleKeyframe(globeDisplay.Globe, dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs, dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs); //头晕、高血压、糖尿病患者调用该函数请慎重! //=========================================== 创建中间帧 == == == == == == == == == == == == == == == == == == == == == = //animationTrack.InsertKeyframe(keyframe2, animationTrack.KeyframeCount); animationTrack.InsertKeyframe(keyframe3, animationTrack.KeyframeCount); // Set The Animation Track Name animationTrack.Name = "Zoom Over Location"; // Set Track Attachments animationTrack.AttachObject(globeCamera); animationTrack.ApplyToAllViewers = true; // Add The New Track To The Scene animationTracks.AddTrack(animationTrack); // Return The Newly Create Aninmation Track } catch { } return(animationTrack); }
private IPolygon CreateBox(IPoint centre, double orientation, double size, esriUnits units) { // Orientation is in degrees from east, counterclockwise // First point in the polygon will be on a face, at the orientation point // Four points on the corners will be at sqrt(2) * size, // at orientation+45, orientation+135, orientation+225 and orientation+315 ISDUTExtension theExt = this.Extension; IPolygon theBox = new PolygonClass(); ISpatialReference theWorkingReference = theExt.FocusMap.SpatialReference; theBox.SpatialReference = theWorkingReference; esriUnits theWorkingUnits = esriUnits.esriMeters; UnitConverter theConverter = new UnitConverterClass(); double theSize = theConverter.ConvertUnits(size, units, theWorkingUnits); double theCornerDistance = Math.Sqrt(2) * theSize; IPoint theCentroid = this._Wellsite; theCentroid.Project(theWorkingReference); Debug.WriteLine("Box centroid X: " + theCentroid.X + " Y: " + theCentroid.Y); IPointCollection thePtColl = (IPointCollection)theBox; object theMissing = Type.Missing; // Place the first point IPoint thePoint = new PointClass(); thePoint.SpatialReference = theWorkingReference; double theAngle = orientation * Math.PI / 180; ((IConstructPoint2)thePoint).ConstructAngleDistance(theCentroid, theAngle, theSize); Debug.WriteLine(" First point X: " + thePoint.X + " Y: " + thePoint.Y); thePtColl.AddPoint(thePoint, ref theMissing, ref theMissing); // Place the corners for (int i = 1; i <= 4; i++) { thePoint = new PointClass(); thePoint.SpatialReference = theWorkingReference; theAngle = (orientation - 45 + (i * 90)) * Math.PI / 180; ((IConstructPoint2)thePoint).ConstructAngleDistance(theCentroid, theAngle, theCornerDistance); Debug.WriteLine(" Corner " + i + " X: " + thePoint.X + " Y: " + thePoint.Y); thePtColl.AddPoint(thePoint, ref theMissing, ref theMissing); } theBox.Close(); return theBox; }
//定位 private void button1_Click(object sender, EventArgs e) { //ESRI.ArcGIS.esriSystem.IUnitConverter unitConverter = (ESRI.ArcGIS.esriSystem.IUnitConverter)ServerContext.CreateObject("esriSystem.UnitConverter"); //project raster //IUnitConverter iu = new esriUnits(); IUnitConverter unitConverter = new UnitConverterClass(); double dFittedBoundsWidthInches = unitConverter.ConvertUnits(-100, esriUnits.esriDecimalDegrees, esriUnits.esriMeters)/100; double dFittedBoundsWidthInchesy = unitConverter.ConvertUnits(40, esriUnits.esriDecimalDegrees, esriUnits.esriMeters)/100; //ui.ConvertUnits(10, esriUnits.esriMeters, esriUnits.esriMeters); //IPoint pPoint = new PointClass(); //pPoint.X = -1000; //pPoint.Y = -1000; //IGeometry pGeometry; //pGeometry = (IGeometry)pPoint; //IMarkerSymbol pMarkerSymbol = new SimpleMarkerSymbolClass(); //axMapControl.FlashShape(pGeometry, 4, 100, pMarkerSymbol); IEnvelope pEnvelope = new EnvelopeClass(); IPoint pPoint = new PointClass(); //axMapControl.MapUnits = esriUnits.esriDecimalDegrees; //axMapControl.MapUnits = esriUnits.esriMeters; //米 // esriUnits mapUnits = axMapControl.MapUnits; //axMapControl.MapUnits = esriUnits.esriDecimalDegrees; //pPoint.PutCoords(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text));//该句中的txtlong,txtlat是输入经纬值的TextBox pPoint.X = Convert.ToDouble(textBox1.Text); pPoint.Y = Convert.ToDouble(textBox2.Text); pEnvelope = axMapControl.Extent; pEnvelope.CenterAt(pPoint); axMapControl.Extent = pEnvelope.Envelope;//前一段代码实现平移 axMapControl.ActiveView.ScreenDisplay.UpdateWindow(); axMapControl.FlashShape(pPoint as IGeometry);//此句实现闪烁(效果没有ArcMap中好, ) //axMapControl.ActiveView.Extent = pEnvelope; //showAnnotationByScale(); }
public override void OnMouseDown(int Button, int Shift, int X, int Y) { if (Button == 2) { return; } IPoint pt = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); pt = GIS.GraphicEdit.SnapSetting.getSnapPoint(pt); IGraphicsContainer g = m_hookHelper.ActiveView.GraphicsContainer; IEnvelope pEnvBounds = null; //获取上一次轨迹线的范围,以便确定刷新范围 try { if (m_TraceLine != null) { m_TraceLine.QueryEnvelope(pEnvBounds); pEnvBounds.Expand(4, 4, true); //矩形框向四周扩大4倍(大于2倍就行),目的是为了保证有充足的刷新区域 } else { pEnvBounds = m_hookHelper.ActiveView.Extent; } } catch { pEnvBounds = m_hookHelper.ActiveView.Extent; } #region 启动画线 if (m_NewLineFeedback == null) { //移除element RemoveElements(); //刷新 m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); Application.DoEvents(); m_NewLineFeedback = new NewLineFeedbackClass(); m_NewLineFeedback.Display = m_hookHelper.ActiveView.ScreenDisplay; //必须先得到symbol,后设置symbol ISimpleLineSymbol simpleLineSymbol = m_NewLineFeedback.Symbol as ISimpleLineSymbol; simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid; simpleLineSymbol.Width = 2; simpleLineSymbol.Color = TransColorToAEColor(Color.Blue); m_NewLineFeedback.Start(pt); } else { m_NewLineFeedback.AddPoint(pt); } if (m_ptColl == null) { m_ptColl = new PolylineClass(); } //记录节点 object obj = Type.Missing; m_ptColl.AddPoint(pt, ref obj, ref obj); #endregion #region 绘制结点 try { IElement vertexElement = createElement_x(pt); // g = m_hookHelper.ActiveView as IGraphicsContainer; //g.AddElement(vertexElement, 0); //g.MoveElementToGroup(vertexElement, m_VertexElement); m_VertexElement.AddElement(vertexElement); //刷新 m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, vertexElement, pEnvBounds); } catch { } #endregion try { if (m_ptColl.PointCount >= 2) { IPoint fromPt = m_ptColl.get_Point(m_ptColl.PointCount - 2); //倒数第二个点 IPoint toPt = m_ptColl.get_Point(m_ptColl.PointCount - 1); //最后第一个点 ILine line = new LineClass(); line.PutCoords(fromPt, toPt); #region 绘制轨迹线 try { object missing = Type.Missing; ISegmentCollection segColl = new PolylineClass(); segColl.AddSegment(line as ISegment, ref missing, ref missing); IElement traceElement = createElement_x(segColl as IPolyline); // g = m_hookHelper.ActiveView as IGraphicsContainer; //g.AddElement(traceElement, 0); //g.MoveElementToGroup(traceElement, m_TraceElement); m_TraceElement.AddElement(traceElement); m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, traceElement, pEnvBounds); } catch { } #endregion #region 计算单线的长度,并将结果显示在单线中点偏上上面 try { double angle = line.Angle; if ((angle > (Math.PI / 2) && angle < (Math.PI)) || (angle > -Math.PI && angle < -(Math.PI / 2))) // 大于90度小于等于180 { angle += Math.PI; } //标注点Y值偏移量 double d_OffsetY = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromPoints(9); //标注点 double d_CenterX = (fromPt.X + toPt.X) / 2; double d_CenterY = (fromPt.Y + toPt.Y) / 2 + d_OffsetY; //向上偏移 IPoint labelPt = new PointClass(); labelPt.PutCoords(d_CenterX, d_CenterY); IUnitConverter unitConverter = new UnitConverterClass(); double segmentLength = unitConverter.ConvertUnits(line.Length, _MsgInfo.inUnit.pUnit, _MsgInfo.outUnit.pUnit); ITextElement txtElement = CreateTextElement(segmentLength.ToString("0.00")); IElement labelelement = txtElement as IElement; labelelement.Geometry = labelPt; object oElement = (object)labelelement; //根据角度旋转 TransformByRotate(ref oElement, labelPt, angle); ////添加到GraphicsContainer //g.AddElement(labelelement, 0); ////移到m_LabelElement组中 //g.MoveElementToGroup(labelelement, m_LabelElement); //添加到组 m_LabelElement.AddElement(labelelement); //刷新 m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, labelelement, pEnvBounds); } catch { } #endregion } } catch { } _MsgInfo.LineResultChange(); }
public static IAnimationTrack CreateZoomOverLocationAnimation(IGlobeDisplay globeDisplay, IBookmark3D pBookmark3D) { // Set Mouse Cursor //IMouseCursor mouseCursor = new MouseCursorClass(); //mouseCursor.SetCursor(2); // QI to GlobeDisplayRendering Interface IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering)globeDisplay; // Get Elevation Multiplication Factor IUnitConverter unitConverter = new UnitConverterClass(); // Get GlobeDisplay and Camera IGlobe globe = globeDisplay.Globe; IAnimationTracks animationTracks = (IAnimationTracks)globe; IGlobeCamera globeCamera = (IGlobeCamera)globeDisplay.ActiveViewer.Camera; // Create New Animation Track IAnimationTrack animationTrack = new AnimationTrackClass(); try { IAnimationType animationType = new AnimationTypeGlobeCameraClass(); animationTrack.AnimationType = animationType; // Create First KeyFrame At Current Location IKeyframe keyframe1 = new GlobeCameraKeyframeClass(); keyframe1.CaptureProperties((IScene)globe, globeCamera); animationTrack.InsertKeyframe(keyframe1, animationTrack.KeyframeCount); //// Create Last KeyFrame Over Desired Location //pBookmark3D.Apply(globeDisplay.ActiveViewer as ISceneViewer, false, 0); //IKeyframe keyframe3 = new GlobeCameraKeyframeClass(); //keyframe3.CaptureProperties((IScene)globe, globeCamera); IKeyframe keyframe3 = CreateKeyframefromBook(globeDisplay.Globe, pBookmark3D) as IKeyframe; #region 获取第一帧和第三帧的参数 double dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs; GetParametersFromKeyFrame(keyframe1, out dX1_Tar, out dY1_Tar, out dZ1_Tar, out dX1_Obs, out dY1_Obs, out dZ1_Obs); double dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs; GetParametersFromKeyFrame(keyframe3, out dX3_Tar, out dY3_Tar, out dZ3_Tar, out dX3_Obs, out dY3_Obs, out dZ3_Obs); #endregion //=========================================== 创建中间帧 =========================================== //IKeyframe keyframe2 = CreateMiddleKeyframe(globeDisplay.Globe, dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs, // dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs); //头晕、高血压、糖尿病患者调用该函数请慎重! //=========================================== 创建中间帧 =========================================== //animationTrack.InsertKeyframe(keyframe2, animationTrack.KeyframeCount); animationTrack.InsertKeyframe(keyframe3, animationTrack.KeyframeCount); // Set The Animation Track Name animationTrack.Name = "Zoom Over Location From Bookmark"; // Set Track Attachments animationTrack.AttachObject(globeCamera); animationTrack.ApplyToAllViewers = true; // Add The New Track To The Scene animationTracks.AddTrack(animationTrack); // Return The Newly Create Aninmation Track } catch { } return(animationTrack); }
//双击则创建该线,并弹出缓冲窗体 public override void OnDblClick() { //获取折线 并获取当前视图的屏幕显示 if (m_pNewPolygonFeedback == null) { return; } IPolygon pPolygon = m_pNewPolygonFeedback.Stop(); m_pNewPolygonFeedback = null; //不存在,为空。尺寸不够均退出 if (pPolygon == null || pPolygon.IsEmpty) { return; } //xisheng 判断面积的高度,宽度时需判断是什么单位,若是经纬度则需要转换。20111220 double w = pPolygon.Envelope.Width; double h = pPolygon.Envelope.Height; UnitConverter conver = new UnitConverterClass(); if (m_MapControl.Map.MapUnits == esriUnits.esriDecimalDegrees) { w = conver.ConvertUnits(w, esriUnits.esriDecimalDegrees, esriUnits.esriMeters); h = conver.ConvertUnits(h, esriUnits.esriDecimalDegrees, esriUnits.esriMeters); } if (w < 0.01 || h < 0.01) { return; } //xisheng 20111220 end ********************************************************* //创建Topo对象,简化后统一空间参考 ITopologicalOperator pTopo = (ITopologicalOperator)pPolygon; pTopo.Simplify(); pPolygon.Project(m_MapControl.Map.SpatialReference); if (m_frmQuery == null) { m_frmQuery = new frmQuery(m_MapControl, m_enumQueryMode); m_frmQuery.Owner = m_mainFrm; m_frmQuery.FormClosed += new FormClosedEventHandler(frmQuery_FormClosed); } if (this.WriteLog) { Plugin.LogTable.Writelog("面缓冲查询");//xisheng 日志记录 0928; } //清除上次的所有元素 (m_MapControl.Map as IGraphicsContainer).DeleteAllElements(); m_frmBufferSet = new frmBufferSet(pPolygon as IGeometry, m_MapControl.Map, m_frmQuery); IGeometry pGeometry = m_frmBufferSet.GetBufferGeometry(); if (pGeometry == null || m_frmBufferSet.Res == false) { return; } // m_frmQuery.Show(); ///ZQ 20111119 modify //m_frmQuery.FillData(m_MapControl.ActiveView.FocusMap, pGeometry,m_frmBufferSet.pesriSpatialRelEnum); _QueryBar.m_pMapControl = m_MapControl; _QueryBar.EmergeQueryData(m_MapControl.ActiveView.FocusMap, pGeometry, m_frmBufferSet.pesriSpatialRelEnum); try { DevComponents.DotNetBar.Bar pBar = _QueryBar.Parent.Parent as DevComponents.DotNetBar.Bar; if (pBar != null) { pBar.AutoHide = false; //pBar.SelectedDockTab = 1; int tmpindex = pBar.Items.IndexOf("dockItemDataCheck"); pBar.SelectedDockTab = tmpindex; } } catch { } }
public override int Execute(string logfileName) { this.InitLogging(logfileName); this.LogMessage(this.Name + " QA test execution started."); bool bProblemsRunning = false; int currentOid = -1; try { this.LogMessage(this.Name + " Parameters:"); for (int i = 0; i < this.ParameterCount; i++) this.LogMessage(this.get_ParameterText(i) + ": " + this.get_ParameterValue(i)); this.ClearErrors(); for (int layerIdx = 0; layerIdx < this.LayerCount; layerIdx++) { IFeatureLayer theFLayer = this.get_Layer(layerIdx); IFeatureClass theFClass = theFLayer.FeatureClass; IDataset theDataset = (IDataset)theFClass; if (!this.SupportsGeometryType(theFClass.ShapeType)) { this.LogMessage("Overlap detector does not support the geometry type in featureclass " + theDataset.Name); bProblemsRunning = true; } else if (theFClass.FeatureDataset == null) { this.LogMessage("Featureclass " + theDataset.Name + " is not in a feature dataset"); bProblemsRunning = true; } else { this.LogMessage("Looking for topology with overlap rule including featureclass " + theDataset.Name); ITopology theTopology = null; ArrayList theTRules = new ArrayList(); ITopologyRule theTopoRule = null; IEnumDataset theDatasetEnum = theFClass.FeatureDataset.Subsets; IDataset theSiblingDS = theDatasetEnum.Next(); while (theSiblingDS != null) { if (theSiblingDS.Type == esriDatasetType.esriDTTopology) { // Look for a gap rule featuring theFClass theTopology = (ITopology)theSiblingDS; ITopologyRuleContainer theTRContainer = (ITopologyRuleContainer)theTopology; IEnumRule theRules = theTRContainer.get_RulesByClass(theFClass.FeatureClassID); theTopoRule = (ITopologyRule)theRules.Next(); while (theTopoRule != null) { if (theTopoRule.TopologyRuleType == esriTopologyRuleType.esriTRTAreaNoOverlap) theTRules.Add(theTopoRule); theTopoRule = (ITopologyRule)theRules.Next(); } } theSiblingDS = theDatasetEnum.Next(); } if (theTopology == null || theTRules.Count == 0) { this.LogMessage("Featureclass " + theDataset.Name + " is not part of an Overlap topology rule"); bProblemsRunning = true; continue; } if (this.ValidateTopology(theTopology) == false) { this.LogMessage("The topology " + ((IDataset)theTopology).Name + " could not be validated"); bProblemsRunning = true; continue; } if (theTopology.State == esriTopologyState.esriTSAnalyzedWithErrors) { this.LogMessage("Processing overlap errors in featureclass " + theDataset.Name + " as it relates to Topology " + ((IDataset)theTopology).Name); IErrorFeatureContainer theTopoErrorContainer = (IErrorFeatureContainer)theTopology; int count = 0; int countIncrement = 500; DoubleParameterInfo theParam = (DoubleParameterInfo)this._params[this.FindParameter("ignore-overlap-larger-than")]; double maxOverlap = (double)theParam.ParamValue; theParam = (DoubleParameterInfo)this._params[this.FindParameter("ignore-overlap-smaller-than")]; double minOverlap = (double)theParam.ParamValue; // Convert gap limits to metres UnitsParameterInfo theUnits = (UnitsParameterInfo)this._params[this.FindParameter("overlap-units")]; IUnitConverter theConverter = new UnitConverterClass(); maxOverlap = theConverter.ConvertUnits(maxOverlap, theUnits.ParamValueInUnits, esriUnits.esriMeters); minOverlap = theConverter.ConvertUnits(minOverlap, theUnits.ParamValueInUnits, esriUnits.esriMeters); for (int j = 0; j < theTRules.Count; j++) { theTopoRule = (ITopologyRule)theTRules[j]; this.LogMessage("Processing rule " + (j+1) + " of " + theTRules.Count); string theSubtypeName = ""; if (theFClass is ISubtypes && ((ISubtypes)theFClass).HasSubtype) { IEnumSubtype theSubtypes = ((ISubtypes)theFClass).Subtypes; int theValue; string theLabel = theSubtypes.Next(out theValue); while (theLabel.Length > 0) { if (theValue == theTopoRule.OriginSubtype) { theSubtypeName = theLabel; break; } theLabel = theSubtypes.Next(out theValue); } } IGeoDataset theGeoDS = (IGeoDataset)theTopology; IEnumTopologyErrorFeature theTopoErrors = theTopoErrorContainer.get_ErrorFeatures(theGeoDS.SpatialReference, theTopoRule, null, true, false); ITopologyErrorFeature theTopoErrorFeature = theTopoErrors.Next(); while (theTopoErrorFeature != null) { currentOid = theTopoErrorFeature.ErrorID; // Analysis here ArrayList theList = ProcessFeature( theTopoErrorFeature, theDataset, theSubtypeName, maxOverlap, minOverlap); if (theList != null) { foreach (DataQualityError dqe in theList) this._errors.Add(dqe); } if (++count % countIncrement == 0) { this.LogMessage("Processed " + count + " topology errors..."); } theTopoErrorFeature = theTopoErrors.Next(); } } } else { this.LogMessage("Topology has no errors"); } } } this.LogMessage("Number of errors found: " + this.ErrorCount); this.LogMessage("Test " + this.Name + " successful."); } catch (Exception ex) { this.LogMessage("Exception caught: \n" + ex.Message + "\n" + ex.StackTrace.ToString()); this.LogMessage("id of the current polygon: " + currentOid); return -1; } finally { this.StopLogging(); } if (bProblemsRunning) return -1; return this.ErrorCount; }
private void GenerateReportOfSegment(double BegMeasure, double endMeasure, string outFile) { if (checkBoxRotateMap.Checked) { IFeatureLayer pCenterlineLayer = null; string pCenterlineFileName = comboBoxExCenterline.SelectedItem.ToString(); for (int i = 0; i < pMapcontrol.LayerCount; i++) { if (pCenterlineFileName == pMapcontrol.get_Layer(i).Name) { pCenterlineLayer = pMapcontrol.get_Layer(i) as IFeatureLayer; } } IFeatureClass pCenterlineFC = pCenterlineLayer.FeatureClass; try { IFeatureCursor pCurcor = pCenterlineFC.Search(null, false); IFeature pFeature = pCurcor.NextFeature(); IGeometry pGeo = pFeature.Shape; IMSegmentation pMS = pGeo as IMSegmentation; double minM = pMS.MMin; double maxM = pMS.MMax; BegMeasure = BegMeasure < minM ? minM : BegMeasure; endMeasure = endMeasure > maxM ? maxM : endMeasure; IPoint begPt = pMS.GetPointsAtM(BegMeasure, 0).Geometry[0] as IPoint; IPoint endPt = pMS.GetPointsAtM(endMeasure, 0).Geometry[0] as IPoint; ISpatialReference sourcePrj; sourcePrj = pCenterlineFC.Fields.get_Field(pCenterlineFC.FindField(pCenterlineFC.ShapeFieldName)).GeometryDef.SpatialReference; ISpatialReference targetPrj = pMapcontrol.Map.SpatialReference; IPoint begPtPrj; IPoint endPtPrj; begPt.Project(targetPrj); endPt.Project(targetPrj); begPtPrj = begPt; endPtPrj = endPt; IActiveView pView = this.pMapcontrol.Map as IActiveView; pView.ScreenDisplay.DisplayTransformation.Rotation = 0; double widthHeightR = (((double)pView.ExportFrame.right - pView.ExportFrame.left) / ((double)pView.ExportFrame.bottom - pView.ExportFrame.top)); // Dim fw As New FileWindow(begPt, endPt, widthHeightR) MCenterlineUtil fw = new MCenterlineUtil(begPtPrj, endPtPrj, widthHeightR); fw.FitActiveViewTo(pView, true); System.Runtime.InteropServices.Marshal.ReleaseComObject(pCurcor); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } } #region //导出arcmap 地图 export mapfram IPageLayout _PageLayout = this.pPageLayoutControl.PageLayout; SizeF m_PageSize = new SizeF(); double width; double hight; _PageLayout.Page.QuerySize(out width, out hight); m_PageSize.Width = Convert.ToSingle(width); m_PageSize.Height = Convert.ToSingle(hight); IUnitConverter pUConvert = new UnitConverterClass(); esriUnits ut = _PageLayout.Page.Units; float pageUnitToInchUnitScale = (float)pUConvert.ConvertUnits(1, ut, esriUnits.esriInches); var layerOutPageSize = m_PageSize; var outputDPI = 300; int BandHeadWidth = 40; var originalActiveView = _PageLayout as IActiveView; var activeView = _PageLayout as IActiveView; originalActiveView.Refresh(); var avEvents = _PageLayout as IActiveViewEvents; float centerX = layerOutPageSize.Width / 2; float centerY = layerOutPageSize.Height / 2; var backGroundEnv = new Envelope() as IEnvelope; backGroundEnv.PutCoords(0, 0, layerOutPageSize.Width, layerOutPageSize.Height); activeView.Extent = backGroundEnv; //System.Threading.Thread.Sleep(2000); IExport pExporter = new ExportPDF() as IExport; pExporter.ExportFileName = outFile; pExporter.Resolution = outputDPI; var pExPdf = pExporter as IExportPDF; pExPdf.Compressed = true; pExPdf.ImageCompression = esriExportImageCompression.esriExportImageCompressionDeflate; var screenResolution = GetCurrentScreenResolution(); var outputResolution = outputDPI; ESRI.ArcGIS.esriSystem.tagRECT exportRECT; exportRECT.left = 0; exportRECT.top = 0; exportRECT.right = (int)(activeView.ExportFrame.right * outputResolution / screenResolution) + 1; exportRECT.bottom = (int)(activeView.ExportFrame.bottom * outputResolution / screenResolution) + 1; var envelope = new Envelope() as IEnvelope; envelope.PutCoords(exportRECT.left, exportRECT.top, exportRECT.right, exportRECT.bottom); pExporter.PixelBounds = envelope; var hDC = pExporter.StartExporting(); activeView.Output(hDC, outputDPI, exportRECT, backGroundEnv, null); pExporter.FinishExporting(); pExporter.Cleanup(); // MessageBox.Show("Export finished."); #endregion #region //根据中线图层生成剖面图 System.Drawing.Point LastBottomLeftPoint = new System.Drawing.Point(); int bandwidth = 0; PdfGraphics pGraphics = null; IFeatureLayer pCenterlinePointLayer = null; string centerlinePointnName = cboBoxPointLayer.SelectedItem.ToString(); for (int i = 0; i < pMapcontrol.LayerCount; i++) { if (centerlinePointnName == pMapcontrol.get_Layer(i).Name) { pCenterlinePointLayer = pMapcontrol.get_Layer(i) as IFeatureLayer; } } IQueryFilter pQF = null; DataTable centerlinePointTable = AOFunctions.GDB.ITableUtil.GetDataTableFromITable(pCenterlinePointLayer.FeatureClass as ITable, pQF); chartControl1.Series.Clear(); Series series = new Series("高程", ViewType.Line); Series series2 = new Series("埋深", ViewType.Line); SecondaryAxisY myAxisY = new SecondaryAxisY("埋深"); foreach (DataRow r in centerlinePointTable.Rows) { double m; double z; double underz; m = Convert.ToDouble(r[EvConfig.CenterlineMeasureField]); if (m < BegMeasure || m > endMeasure) { continue; } if (r[EvConfig.CenterlineMeasureField] != DBNull.Value && r[EvConfig.CenterlineZField] != DBNull.Value) { m = Convert.ToDouble(r[EvConfig.CenterlineMeasureField]); z = Convert.ToDouble(r[EvConfig.CenterlineZField]); series.Points.Add(new SeriesPoint(m, z)); } // if (r[EvConfig.CenterlineMeasureField] != DBNull.Value && r["管道埋深("] != DBNull.Value) if (r[EvConfig.CenterlineMeasureField] != DBNull.Value && r[EvConfig.CenterlineBuryDepthField] != DBNull.Value) { m = Convert.ToDouble(r[EvConfig.CenterlineMeasureField]); z = Convert.ToDouble(r[EvConfig.CenterlineBuryDepthField]); series2.Points.Add(new SeriesPoint(m, z)); } } chartControl1.Series.Add(series); chartControl1.Series.Add(series2); ((XYDiagram)chartControl1.Diagram).SecondaryAxesY.Clear(); ((XYDiagram)chartControl1.Diagram).SecondaryAxesX.Clear(); ((XYDiagram)chartControl1.Diagram).SecondaryAxesY.Add(myAxisY); ((LineSeriesView)series2.View).AxisY = myAxisY; ((LineSeriesView)series.View).AxisY = ((XYDiagram)chartControl1.Diagram).AxisY; series.ChangeView(ViewType.Line); ((XYDiagram)chartControl1.Diagram).AxisY.WholeRange.Auto = true; myAxisY.WholeRange.Auto = true; series2.ChangeView(ViewType.Line); myAxisY.Tickmarks.Visible = true; myAxisY.Tickmarks.MinorVisible = false; ((XYDiagram)chartControl1.Diagram).AxisX.WholeRange.AutoSideMargins = false; ((XYDiagram)chartControl1.Diagram).AxisX.WholeRange.SideMarginsValue = 0; ((XYDiagram)chartControl1.Diagram).AxisX.WholeRange.SetMinMaxValues(BegMeasure, endMeasure); series.ArgumentScaleType = ScaleType.Numerical; int ProfileMapHight = 8; #endregion #region export chartcontrol IGraphicsContainer pGC = _PageLayout as IGraphicsContainer; pGC.Reset(); IElement pE = pGC.Next(); while (pE != null) { if (pE is IMapFrame) { // framgeo related to _PageLayout.Page pagesize, 8.5 x 11, inch IEnvelope framgeo = pE.Geometry.Envelope as IEnvelope; float defaultDPI = PdfGraphics.DefaultDpi; double x = defaultDPI * framgeo.LowerLeft.X * pageUnitToInchUnitScale; double y = defaultDPI * (layerOutPageSize.Height - framgeo.LowerLeft.Y) * pageUnitToInchUnitScale + 1; bandwidth = (int)(defaultDPI * (framgeo.Width * pageUnitToInchUnitScale)); LastBottomLeftPoint.X = (int)x; LastBottomLeftPoint.Y = (int)y; chartControl1.Size = new System.Drawing.Size((int)(framgeo.Width * pageUnitToInchUnitScale * defaultDPI), (int)(ProfileMapHight * pageUnitToInchUnitScale * defaultDPI)); Image img = null; Bitmap bmp = null; // Create an image of the chart. ImageFormat format = ImageFormat.Png; using (MemoryStream s = new MemoryStream()) { chartControl1.ExportToImage(s, format); img = Image.FromStream(s); bmp = new Bitmap(img); bmp.SetResolution(300, 300); } using (PdfDocumentProcessor processor = new PdfDocumentProcessor()) { processor.LoadDocument(outFile); PdfDocument pd = processor.Document; PdfPage page = pd.Pages[0]; PdfRectangle pdfrec = page.MediaBox; // RectangleF rf = new RectangleF(0, 0, Convert.ToSingle(pdfrec.Width) * 96 / 72, Convert.ToSingle(pdfrec.Height) * 96 / 72); // Create and draw PDF graphics. using (pGraphics = processor.CreateGraphics()) { PdfGraphics graph = pGraphics; Pen defaultPen = new Pen(Color.Black); defaultPen.Width = 1; graph.DrawImage(bmp, new RectangleF((float)x, (float)y, (float)framgeo.Width * pageUnitToInchUnitScale * defaultDPI, (float)ProfileMapHight * pageUnitToInchUnitScale * defaultDPI)); // draw map head. RectangleF MapheadRect = new RectangleF((float)(int)(defaultDPI * framgeo.XMin * pageUnitToInchUnitScale - BandHeadWidth), (float)(int)(defaultDPI * (layerOutPageSize.Height - framgeo.UpperLeft.Y) * pageUnitToInchUnitScale), (float)(int)(BandHeadWidth), (float)(int)(defaultDPI * framgeo.Height * pageUnitToInchUnitScale)); graph.DrawRectangle(defaultPen, MapheadRect); //draw head text RectangleF rF = new RectangleF(0, 0, (float)MapheadRect.Height, (float)BandHeadWidth); PdfStringFormat psf = new PdfStringFormat(PdfStringFormat.GenericDefault); psf.Alignment = PdfStringAlignment.Center; psf.LineAlignment = PdfStringAlignment.Center; graph.SaveGraphicsState(); // head box 的左下角 System.Drawing.Font textfont = new System.Drawing.Font("仿宋", 6F); graph.TranslateTransform((float)(MapheadRect.Left), (float)(MapheadRect.Bottom)); graph.RotateTransform(270); graph.DrawString("地图", textfont, new SolidBrush(Color.Black), rF, psf); graph.RestoreGraphicsState(); // draw chart head RectangleF ChartheadRect = new RectangleF((float)(int)(defaultDPI * framgeo.XMin * pageUnitToInchUnitScale - BandHeadWidth), (float)(int)(defaultDPI * (layerOutPageSize.Height - framgeo.LowerLeft.Y) * pageUnitToInchUnitScale + 1), (float)(int)(BandHeadWidth), (float)(int)(defaultDPI * ProfileMapHight * pageUnitToInchUnitScale)); graph.DrawRectangle(defaultPen, ChartheadRect); //draw head text rF = new RectangleF(0, 0, (float)ChartheadRect.Height, (float)BandHeadWidth); graph.SaveGraphicsState(); // head box 的左下角 graph.TranslateTransform((float)(ChartheadRect.Left), (float)(ChartheadRect.Bottom)); graph.RotateTransform(270); graph.DrawString("剖面图", textfont, new SolidBrush(Color.Black), rF, psf); graph.RestoreGraphicsState(); LastBottomLeftPoint.Y = (int)ChartheadRect.Bottom; //double beginM = -999; double endM = -999; //GetIMUBeginEndMeasure(ref beginM, ref endM); double beginM = BegMeasure; double endM = endMeasure; for (int i = 0; i < listBoxDrawBandFields.Items.Count; i++) { string fieldname = listBoxDrawBandFields.Items[i].ToString(); band b = new band(); b.BandName = fieldname; b.pdfGC = pGraphics; b.BandWidth = (int)bandwidth; b.headFont = labelbiaotou.Font; b.ContentFont = labelNeirong.Font; System.Drawing.Point pt = new System.Drawing.Point(); pt.X = LastBottomLeftPoint.X; pt.Y = LastBottomLeftPoint.Y; b.BandTopLeftLocation = pt; b.BeginM = beginM; b.EndM = endM; //b.bandData = new List<Tuple<double, string>>(); //for (int j = 0; j < 6; j++) //{ // double m = j * 500; // string txt = "异常2"; // Tuple<double, string> t = new Tuple<double, string>(m,txt); // b.bandData.Add(t); //} b.bandData = GetPDFBandData(fieldname); b.Draw(); LastBottomLeftPoint.Y += (int)b.BandHight; } // graph.DrawImage(img, rf); graph.AddToPageForeground(page); // Render a page with graphics. //processor.RenderNewPage(PdfPaperSize.Letter, graph); processor.SaveDocument(outFile); } } break; } pE = pGC.Next(); } #endregion }
/// <summary> /// Converts the specified numeric data value from one unit of measure to another unit of measure. /// </summary> /// <param name="source">The source units of the value.</param> /// <param name="value">The value.</param> /// <param name="target">The target units that that the source units should be converted to.</param> /// <returns>Returns a <see cref="double" /> representing the converted units.</returns> public static double ConvertTo(this esriUnits source, double value, esriUnits target) { IUnitConverter converter = new UnitConverterClass(); return(converter.ConvertUnits(value, source, target)); }
public double getLinearConversion(IProjectedCoordinateSystem prjSys) { IUnitConverter converter = new UnitConverterClass(); ILinearUnit linearUnit = prjSys.CoordinateUnit; double meter = linearUnit.MetersPerUnit; double unitToFoot = converter.ConvertUnits(meter, esriUnits.esriMeters, esriUnits.esriFeet); return unitToFoot; }
public static IAnimationTrack CreateZoomOverLocationAnimation(IGlobeDisplay globeDisplay, IBookmark3D pBookmark3D) { // Set Mouse Cursor //IMouseCursor mouseCursor = new MouseCursorClass(); //mouseCursor.SetCursor(2); // QI to GlobeDisplayRendering Interface IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering)globeDisplay; // Get Elevation Multiplication Factor IUnitConverter unitConverter = new UnitConverterClass(); // Get GlobeDisplay and Camera IGlobe globe = globeDisplay.Globe; IAnimationTracks animationTracks = (IAnimationTracks)globe; IGlobeCamera globeCamera = (IGlobeCamera)globeDisplay.ActiveViewer.Camera; // Create New Animation Track IAnimationTrack animationTrack = new AnimationTrackClass(); try { IAnimationType animationType = new AnimationTypeGlobeCameraClass(); animationTrack.AnimationType = animationType; // Create First KeyFrame At Current Location IKeyframe keyframe1 = new GlobeCameraKeyframeClass(); keyframe1.CaptureProperties((IScene)globe, globeCamera); animationTrack.InsertKeyframe(keyframe1, animationTrack.KeyframeCount); //// Create Last KeyFrame Over Desired Location //pBookmark3D.Apply(globeDisplay.ActiveViewer as ISceneViewer, false, 0); //IKeyframe keyframe3 = new GlobeCameraKeyframeClass(); //keyframe3.CaptureProperties((IScene)globe, globeCamera); IKeyframe keyframe3 = CreateKeyframefromBook(globeDisplay.Globe, pBookmark3D) as IKeyframe; #region 获取第一帧和第三帧的参数 double dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs; GetParametersFromKeyFrame(keyframe1, out dX1_Tar, out dY1_Tar, out dZ1_Tar, out dX1_Obs, out dY1_Obs, out dZ1_Obs); double dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs; GetParametersFromKeyFrame(keyframe3, out dX3_Tar, out dY3_Tar, out dZ3_Tar, out dX3_Obs, out dY3_Obs, out dZ3_Obs); #endregion //=========================================== 创建中间帧 =========================================== //IKeyframe keyframe2 = CreateMiddleKeyframe(globeDisplay.Globe, dX1_Tar, dY1_Tar, dZ1_Tar, dX1_Obs, dY1_Obs, dZ1_Obs, // dX3_Tar, dY3_Tar, dZ3_Tar, dX3_Obs, dY3_Obs, dZ3_Obs); //头晕、高血压、糖尿病患者调用该函数请慎重! //=========================================== 创建中间帧 =========================================== //animationTrack.InsertKeyframe(keyframe2, animationTrack.KeyframeCount); animationTrack.InsertKeyframe(keyframe3, animationTrack.KeyframeCount); // Set The Animation Track Name animationTrack.Name = "Zoom Over Location From Bookmark"; // Set Track Attachments animationTrack.AttachObject(globeCamera); animationTrack.ApplyToAllViewers = true; // Add The New Track To The Scene animationTracks.AddTrack(animationTrack); // Return The Newly Create Aninmation Track } catch { } return animationTrack; }
/// <summary> /// 内插中间贞函数,只需给出第一帧和最后一帧的状态信息,即可内插出中间帧状态 /// </summary> /// <param name="pGlobe"></param> /// <param name="doubleX1_Tar">第一帧目标点X坐标</param> /// <param name="doubleY1_Tar">第一帧目标点Y坐标</param> /// <param name="doubleZ1_Tar">第一帧目标点Z坐标</param> /// <param name="doubleX1_Obs">第一帧观察点X坐标</param> /// <param name="doubleY1_Obs">第一帧观察点Y坐标</param> /// <param name="doubleZ1_Obs">第一帧观察点Z坐标</param> /// <param name="doubleX2_Tar">第二帧目标点X坐标</param> /// <param name="doubleY2_Tar">第二帧目标点Y坐标</param> /// <param name="doubleZ2_Tar">第二帧目标点Z坐标</param> /// <param name="doubleX2_Obs">第二帧观察点X坐标</param> /// <param name="doubleY2_Obs">第二帧观察点Y坐标</param> /// <param name="doubleZ2_Obs">第二帧观察点Z坐标</param> /// <returns></returns> private static IKeyframe CreateMiddleKeyframe(IGlobe pGlobe, double doubleX1_Tar, double doubleY1_Tar, double doubleZ1_Tar, double doubleX1_Obs, double doubleY1_Obs, double doubleZ1_Obs, double doubleX2_Tar, double doubleY2_Tar, double doubleZ2_Tar, double doubleX2_Obs, double doubleY2_Obs, double doubleZ2_Obs) { IUnitConverter unitConverter = new UnitConverterClass(); IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering)pGlobe.GlobeDisplay; IKeyframe pMidKeyframe = new GlobeCameraKeyframeClass(); try { pMidKeyframe.set_PropertyValueInt(0, 0); pMidKeyframe.set_PropertyValueDouble(1, (doubleY1_Tar + doubleY2_Tar) / 2);//doubleY_mid); pMidKeyframe.set_PropertyValueDouble(2, (doubleX1_Tar + doubleX2_Tar) / 2);//doubleX_mid); pMidKeyframe.set_PropertyValueDouble(3, (doubleZ1_Tar + doubleZ2_Tar) / 2); //doubleZ1_Tar/2);//// (globeDisplayRendering.GlobeRadius / -1000)); pMidKeyframe.set_PropertyValueDouble(4, (doubleY1_Obs + doubleY2_Obs) / 2);//doubleY_mid); pMidKeyframe.set_PropertyValueDouble(5, (doubleX1_Obs + doubleX2_Obs) / 2);//doubleX_mid); //改善中间过程用户体验,增加中间点Observer的高度,让高度约等于两点间距离+海拔高度 double doubleAltitide_mid = ReturnProjectDistance(pGlobe, doubleX1_Obs, doubleY1_Obs, doubleZ1_Obs, doubleX2_Obs, doubleY2_Obs, doubleZ2_Obs) / 1000; //KM //加入地表高程 doubleAltitide_mid += GetGlobeElevation(pGlobe.GlobeDisplay, (doubleX1_Obs + doubleX2_Obs) / 2, (doubleY1_Obs + doubleY2_Obs) / 2, true); pMidKeyframe.set_PropertyValueDouble(6, doubleAltitide_mid); pMidKeyframe.set_PropertyValueDouble(7, 30); pMidKeyframe.set_PropertyValueDouble(8, 0); } catch { } return pMidKeyframe; }
public override void OnMouseDown(int Button, int Shift, int X, int Y) { if (Button == 2) return; IPoint pt = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); pt = GIS.GraphicEdit.SnapSetting.getSnapPoint(pt); IGraphicsContainer g = m_hookHelper.ActiveView.GraphicsContainer; IEnvelope pEnvBounds = null; //��ȡ��һ�ι켣�ߵķ�Χ,�Ա�ȷ��ˢ�·�Χ try { if (m_TraceLine != null) { m_TraceLine.QueryEnvelope(pEnvBounds); pEnvBounds.Expand(4, 4, true); //���ο�����������4��(����2������),Ŀ����Ϊ�˱�֤�г����ˢ������ } else pEnvBounds = m_hookHelper.ActiveView.Extent; } catch { pEnvBounds = m_hookHelper.ActiveView.Extent; } #region ������� if (m_NewLineFeedback == null) { //�Ƴ�element RemoveElements(); //ˢ�� m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); Application.DoEvents(); m_NewLineFeedback = new NewLineFeedbackClass(); m_NewLineFeedback.Display = m_hookHelper.ActiveView.ScreenDisplay; //�����ȵõ�symbol,������symbol ISimpleLineSymbol simpleLineSymbol = m_NewLineFeedback.Symbol as ISimpleLineSymbol; simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid; simpleLineSymbol.Width = 2; simpleLineSymbol.Color = TransColorToAEColor(Color.Blue); m_NewLineFeedback.Start(pt); } else { m_NewLineFeedback.AddPoint(pt); } if (m_ptColl == null) { m_ptColl = new PolylineClass(); } //��¼�ڵ� object obj = Type.Missing; m_ptColl.AddPoint(pt, ref obj, ref obj); #endregion #region ���ƽ�� try { IElement vertexElement = createElement_x(pt); // g = m_hookHelper.ActiveView as IGraphicsContainer; //g.AddElement(vertexElement, 0); //g.MoveElementToGroup(vertexElement, m_VertexElement); m_VertexElement.AddElement(vertexElement); //ˢ�� m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, vertexElement, pEnvBounds); } catch { } #endregion try { if (m_ptColl.PointCount >= 2) { IPoint fromPt = m_ptColl.get_Point(m_ptColl.PointCount - 2); //�����ڶ����� IPoint toPt = m_ptColl.get_Point(m_ptColl.PointCount - 1); //����һ���� ILine line = new LineClass(); line.PutCoords(fromPt, toPt); #region ���ƹ켣�� try { object missing = Type.Missing; ISegmentCollection segColl = new PolylineClass(); segColl.AddSegment(line as ISegment, ref missing, ref missing); IElement traceElement = createElement_x(segColl as IPolyline); // g = m_hookHelper.ActiveView as IGraphicsContainer; //g.AddElement(traceElement, 0); //g.MoveElementToGroup(traceElement, m_TraceElement); m_TraceElement.AddElement(traceElement); m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, traceElement, pEnvBounds); } catch { } #endregion #region ���㵥�ߵij���,���������ʾ�ڵ����е�ƫ������ try { double angle = line.Angle; if ((angle > (Math.PI / 2) && angle < (Math.PI)) || (angle > -Math.PI && angle < -(Math.PI / 2))) // ����90��С�ڵ���180 angle += Math.PI; //��ע��Yֵƫ���� double d_OffsetY = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromPoints(9); //��ע�� double d_CenterX = (fromPt.X + toPt.X) / 2; double d_CenterY = (fromPt.Y + toPt.Y) / 2 + d_OffsetY; //����ƫ�� IPoint labelPt = new PointClass(); labelPt.PutCoords(d_CenterX, d_CenterY); IUnitConverter unitConverter = new UnitConverterClass(); double segmentLength = unitConverter.ConvertUnits(line.Length, _MsgInfo.inUnit.pUnit, _MsgInfo.outUnit.pUnit); ITextElement txtElement = CreateTextElement(segmentLength.ToString("0.00")); IElement labelelement = txtElement as IElement; labelelement.Geometry = labelPt; object oElement = (object)labelelement; //���ݽǶ���ת TransformByRotate(ref oElement, labelPt, angle); ////��ӵ�GraphicsContainer //g.AddElement(labelelement, 0); ////�Ƶ�m_LabelElement���� //g.MoveElementToGroup(labelelement, m_LabelElement); //��ӵ��� m_LabelElement.AddElement(labelelement); //ˢ�� m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, labelelement, pEnvBounds); } catch { } #endregion } } catch { } _MsgInfo.LineResultChange(); }
public static double GetGlobeElevation(IGlobeDisplay globeDisplay, double longitude, double latitude, bool maxResolution) { IUnitConverter unitConverter = new UnitConverterClass(); double doubleZ = 0; globeDisplay.GetSurfaceElevation(longitude, latitude, maxResolution, out doubleZ); return unitConverter.ConvertUnits(doubleZ, esriUnits.esriMeters, globeDisplay.Globe.GlobeUnits); }
//获取当前的缓冲后的几何体 private void get_BufferGeometry() { Error_Lable.Visible = false; Error_Lable.Text = ""; //存在上次的缓冲几何体 则先抹去其图形 if (m_pBufferGeometry != null) { drawgeometryXOR(m_pBufferGeometry as IPolygon, m_pScreenDisplay); } //获取缓冲半径 dBufferSize = Convert.ToDouble(txtBufferValue.Text); /*/ 10*/; //20110802 xisheng dBufferSize = dBufferSize < 1 ? 1 : dBufferSize; //设置缓冲值不能设置成0 xisheng 20110722 if (dBufferSize == 0.0) { dBufferSize = 0.001; } //转换如果是经纬度的地图 xisheng 20110731 UnitConverter punitConverter = new UnitConverterClass(); if (m_pMap.MapUnits == esriUnits.esriDecimalDegrees) { dBufferSize = punitConverter.ConvertUnits(dBufferSize, esriUnits.esriMeters, esriUnits.esriDecimalDegrees); }//转换如果是经纬度的地图 xisheng 20110731 //==如果直接操作,则原pGeometry会被改变 //进行克隆,获取topo实例 IClone pClone = (IClone)m_pGeometry; ITopologicalOperator pTopo; if (m_pGeometry.GeometryType != esriGeometryType.esriGeometryBag) { pTopo = pClone.Clone() as ITopologicalOperator; //topo非空则进行缓冲,获取缓冲后的 m_pBufferGeometry if (pTopo != null) { m_pBufferGeometry = pTopo.Buffer(dBufferSize); } } else { IGeometryCollection pGeometryBag = (IGeometryCollection)pClone.Clone(); pTopo = (ITopologicalOperator)pGeometryBag.get_Geometry(0); IGeometry pUnionGeom = pTopo.Buffer(dBufferSize); for (int i = 1; i < pGeometryBag.GeometryCount; i++) { pTopo = (ITopologicalOperator)pGeometryBag.get_Geometry(i); IGeometry pTempGeom = pTopo.Buffer(dBufferSize); pTopo = (ITopologicalOperator)pUnionGeom; pUnionGeom = pTopo.Union(pTempGeom); } m_pBufferGeometry = pUnionGeom; } // m_pBufferGeometry为空,直接返回 if (m_pBufferGeometry == null) { return; } //对 m_pBufferGeometry的topo进行简化再绘出 pTopo = m_pBufferGeometry as ITopologicalOperator; if (pTopo != null) { pTopo.Simplify(); } IPolygon pPolygon = m_pBufferGeometry as IPolygon; drawgeometryXOR(pPolygon, m_pScreenDisplay); }
/// <summary> /// Convert ESRI unit enumerations to strings. /// </summary> /// <param name="source">The source.</param> /// <param name="appearance">The appearance to specify the case (eg. lower or upper case) of the string.</param> /// <param name="plural"> /// if set to <c>true</c> the /// string specifies a many unit(s) otherwise single unit. /// </param> /// <returns> /// A <see cref="System.String" /> that represents the enumeration as a string. /// </returns> public static string ToString(this esriUnits source, esriCaseAppearance appearance, bool plural) { IUnitConverter converter = new UnitConverterClass(); return(converter.EsriUnitsAsString(source, appearance, plural)); }
private string ExportPages(IActiveView docActiveView, int iDPI, string filename, enumExportType exportType, double paperWidth, double paperHeight, int blockCount) { string filepath = filename.Substring(0, filename.LastIndexOf("\\")); string NameExt = System.IO.Path.GetFileName(filename); if (docActiveView is IPageLayout) { double width = 0, height = 0; //实际长宽 //计算分页地图大小 paperWidth,paperHeight //分块数量 blockCount //计算分页图片大小 iWidth,iHeight #region 计算出图参数 var pPageLayout = docActiveView as IPageLayout; pPageLayout.Page.QuerySize(out width, out height); IUnitConverter pUnitCon = new UnitConverterClass(); switch (exportType) { case enumExportType.byPaperSize: if (paperWidth <= 0 || paperHeight <= 0) { paperWidth = 210; paperHeight = 297; } paperWidth = pUnitCon.ConvertUnits(paperWidth, esriUnits.esriMillimeters, pPageLayout.Page.Units); paperHeight = pUnitCon.ConvertUnits(paperHeight, esriUnits.esriMillimeters, pPageLayout.Page.Units); bool bW = (width > paperWidth + 0.001) ? true : false; bool bH = (height > paperHeight + 0.001) ? true : false; blockCount = (bW && bH) ? 4 : 1; break; case enumExportType.byBlockCount: default: if (blockCount < 1) blockCount = 1; paperWidth = width / blockCount; paperHeight = height / blockCount; break; } int iWidth = (int)(pUnitCon.ConvertUnits(paperWidth, pPageLayout.Page.Units, esriUnits.esriInches) * iDPI); int iHeight = (int)(pUnitCon.ConvertUnits(paperHeight, pPageLayout.Page.Units, esriUnits.esriInches) * iDPI); #endregion if (System.IO.File.Exists(filename)) { var pWS = OpenWorkspace(filename, enumWsFactoryType.Raster) as IRasterWorkspace; var pRDs = pWS.OpenRasterDataset(NameExt); var pDS = pRDs as IDataset; pDS.Delete(); } if (blockCount > 1) { #region 创建子目录,获得扩展名 string NameNoExt = System.IO.Path.GetFileNameWithoutExtension(filename); string sExt = System.IO.Path.GetExtension(filename).ToLower(); //创建子目录 string subPath = filename.Substring(0, filename.LastIndexOf(".")); if (System.IO.Directory.Exists(subPath)) { System.IO.Directory.Delete(subPath, true); } try { System.IO.Directory.CreateDirectory(subPath); if (!System.IO.Directory.Exists(subPath)) { subPath = subPath + "_1"; System.IO.Directory.CreateDirectory(subPath); } } catch (Exception ex) { MessageBox.Show(ex.Message); subPath = subPath + "_1"; System.IO.Directory.CreateDirectory(subPath); } //worldfile扩展名 string worldfileExt = "." + sExt[1].ToString() + sExt[sExt.Length - 1].ToString() + "w"; #endregion #region 分页输出 int index = 0; int minX = 0, maxY = iHeight; double w, h = 0; string t_name = subPath + @"\" + NameNoExt + "_"; IExport docExport = CreateExport(filename, 1); IEnvelope pEnv1 = new EnvelopeClass(); while (h < height - 0.0001) { w = 0; minX = 0; while (w < width - 0.0001) { pEnv1.XMin = w; pEnv1.YMin = h; pEnv1.XMax = w + paperWidth; pEnv1.YMax = h + paperHeight; index++; label1.Text += "."; Application.DoEvents(); //output输出 ActiveViewOutput(docActiveView, iDPI, iWidth, iHeight, pEnv1, t_name + index.ToString() + sExt, docExport); //写入worldfile WriteWorldfile(t_name + index.ToString() + worldfileExt, 1, 0, 0, -1, minX, maxY); w += paperWidth; minX += iWidth; } h += paperHeight; maxY += iHeight; } #endregion #region 合并栅格 //设置坐标参考 var pRasterWS = OpenWorkspace(subPath, enumWsFactoryType.Raster); ISpatialReferenceFactory2 pSrF = new SpatialReferenceEnvironmentClass(); var pSR = pSrF.CreateSpatialReference(3857); var pEnumDS = pRasterWS.get_Datasets(esriDatasetType.esriDTRasterDataset); var pDS = pEnumDS.Next(); while (pDS != null) { var GeoSchEdit = pDS as IGeoDatasetSchemaEdit; if (GeoSchEdit.CanAlterSpatialReference) GeoSchEdit.AlterSpatialReference(pSR); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(pDS); pDS = pEnumDS.Next(); } System.Runtime.InteropServices.Marshal.FinalReleaseComObject(pRasterWS); //saveas时占用很大内存且不释放,使用GP工具 //怎么不创建金字塔和头文件?? Geoprocessor geoprocessor = new Geoprocessor(); try { CreateRasterDataset createRD = new CreateRasterDataset(); createRD.cellsize = 1; createRD.number_of_bands = 3; createRD.out_path = filepath; createRD.out_name = NameExt; createRD.pyramids = "NONE"; createRD.compression = "NONE"; geoprocessor.Execute(createRD, null); WorkspaceToRasterDataset MosaicToRaster = new WorkspaceToRasterDataset(); MosaicToRaster.in_workspace = subPath; MosaicToRaster.in_raster_dataset = filename; geoprocessor.Execute(MosaicToRaster, null); } catch (Exception exc) { Console.WriteLine(exc.Message); for (int i = 0; i < geoprocessor.MessageCount; i++) { string abc = geoprocessor.GetMessage(i); Console.WriteLine(abc); } } #endregion return subPath; } else { Export10Plus(docActiveView, filename, iDPI, 0, 0, null); return ""; } } else //map { return ""; } }