1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
|
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.GlobeCore;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Analyst3D;
using System.Windows.Forms;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.SystemUI;
namespace TestDrapeApplication
{
///
/// Command that works in ArcGlobe or GlobeControl
///
[Guid("2d4a8248-b8d1-459f-aa4d-c73fdd4cde3b")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("TestDrapeApplication.AddShapeFileMemory")]
public sealed class AddShapeFileMemory : BaseCommand
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
// Required for ArcGIS Component Category Registrar support
ArcGISCategoryRegistration(registerType);
//
// TODO: Add any COM registration code here
//
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
// Required for ArcGIS Component Category Registrar support
ArcGISCategoryUnregistration(registerType);
//
// TODO: Add any COM unregistration code here
//
}
#region ArcGIS Component Category Registrar generated code
///
/// Required method for ArcGIS Component Category registration -
/// Do not modify the contents of this method with the code editor.
///
private static void ArcGISCategoryRegistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
GMxCommands.Register(regKey);
ControlsCommands.Register(regKey);
}
///
/// Required method for ArcGIS Component Category unregistration -
/// Do not modify the contents of this method with the code editor.
///
private static void ArcGISCategoryUnregistration(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
GMxCommands.Unregister(regKey);
ControlsCommands.Unregister(regKey);
}
#endregion
#endregion
private IGlobeHookHelper m_globeHookHelper = null;
public AddShapeFileMemory()
{
//
// TODO: Define values for the public properties
//
base.m_category = "Add Shape File to map"; //localizable text
base.m_caption = "Add Shape File"; //localizable text
base.m_message = "Add shape File to Map"; //localizable text
base.m_toolTip = "Add Shape File to Map"; //localizable text
base.m_name = "AddShapeFileMemory"; //unique id, non-localizable (e.g. "MyCategory_MyCommand")
try
{
//
// TODO: change bitmap name if necessary
//
string bitmapResourceName = GetType().Name + ".bmp";
base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
}
}
#region Overriden Class Methods
///
/// Occurs when this command is created
///
/// Instance of the application
public override void OnCreate(object hook)
{
if (hook == null)
return;
try
{
m_globeHookHelper = new GlobeHookHelperClass();
m_globeHookHelper.Hook = hook;
if (m_globeHookHelper.ActiveViewer == null)
{
m_globeHookHelper = null;
}
}
catch
{
m_globeHookHelper = null;
}
if (m_globeHookHelper == null)
base.m_enabled = false;
else
base.m_enabled = true;
// TODO: Add other initialization code
}
///
/// Occurs when this command is clicked
///
public override void OnClick()
{
//This is run after adding document with elevation Raster layer
IGlobeDisplay globeDisplay = new GlobeDisplayClass();
globeDisplay = m_globeHookHelper.GlobeDisplay;
double lon = -86.00;
double lat = 37.9166;
double alt = 100.0;
double azimuth = 175.0;
double range = 1000; //ConvertMetersToDatasetUnits((IGlobe2)globeDisplay.Globe, 1000.0);
double fov = 60.0;
m_globeHookHelper.GlobeDisplay.RefreshViewers();
//Elevation present to here.
AddElement(ref globeDisplay, azimuth, fov, range, lat, lon, alt);
// still have elevation with polygon under elevated layer.
m_globeHookHelper.GlobeDisplay.RefreshViewers();
}
#endregion
private void AddElement(ref IGlobeDisplay globeDisplay, double azimuth, double fov, double range, double lat, double lon, double alt)
{
//Depending on the ASCII file type set a variable which will control the flow of the application
string shapeType = null;
string sensorID = "Sim.Trip1";
//shapeType = "points";
// shapeType = "polylines";
shapeType = "polygons";
string datasetType = "Shapefile";
IWorkspace workSpace = null;
workSpace = this.CreateWorkspace();
IFields fields = CreateFields(shapeType);
//Create the Feature Class
IFeatureClass featureClass = CreateFeatureClass(workSpace, null, shapeType, fields, null, null, "");
AddShape(ref featureClass, ref workSpace, azimuth, fov, range, lat, lon, alt, sensorID);
//Create a Feature Layer to display the data in ArcMap
IFeatureLayer featureLayer = new FeatureLayerClass();
featureLayer.FeatureClass = featureClass;
featureLayer.Name = featureClass.AliasName;
featureLayer.Visible = true;
IGeoFeatureLayer lyr = (IGeoFeatureLayer)featureLayer;
IRgbColor lyrColor = new RgbColorClass();
lyrColor.Red = 255;
lyrColor.Green = 0;
lyrColor.Blue = 0;
ISimpleFillSymbol sfSymbol = new SimpleFillSymbolClass();
sfSymbol.Color = lyrColor;
sfSymbol.Outline.Width = 0.4;
sfSymbol.Style = esriSimpleFillStyle.esriSFSSolid;
ISimpleRenderer lyrSimRend = new SimpleRendererClass();
lyrSimRend.Symbol = (ISymbol)sfSymbol;
lyr.Renderer = (IFeatureRenderer)lyrSimRend;
((IScene)globeDisplay.Globe).AddLayer(featureLayer, true);
ILayer lyrCreated = featureLayer;
((IActiveView)globeDisplay.Globe).Extent = lyrCreated.AreaOfInterest;
}
private IWorkspace CreateWorkspace()
{
try
{
IWorkspaceFactory workspaceFactory = null;
// Instantiate a Shapefile workspace factory
//workspaceFactory = new ShapefileWorkspaceFactoryClass();
Type factoryType = Type.GetTypeFromProgID("esriDataSourcesFile.ShapefileWorkspaceFactory");
workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
//Create a directory hierarchy to seperate out datasets created for Points, Polylines, and Polygons
IWorkspaceName workspaceName = workspaceFactory.Create(Application.StartupPath + @"\ShapeFile", "Shapefile", null, 0);
IName Name = (IName)workspaceName;
IWorkspace workspace = (IWorkspace)(Name.Open());
return workspace;
}
catch (Exception ex)
{
String mess = ex.Message;
MessageBox.Show(mess);
return null;
}
}
private IFields CreateFields(string shapeType)
{
// Create a new fields collection.
IFields fields = new FieldsClass();
// Cast to IFieldsEdit to modify the properties of the fields collection.
IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
// Set the number of fields the collection will contain.
fieldsEdit.FieldCount_2 = 5;
// Create the ObjectID field.
IField oidField = new FieldClass();
IFieldEdit oidFieldEdit = (IFieldEdit)oidField;
oidFieldEdit.Name_2 = "ObjectID";
oidFieldEdit.AliasName_2 = "FID";
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
fieldsEdit.set_Field(0, oidField);
// Create the myID field.
IField myIDField = new FieldClass();
IFieldEdit myIDFieldEdit = (IFieldEdit)myIDField;
myIDFieldEdit.Name_2 = "SensorID";
myIDFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
fieldsEdit.set_Field(1, myIDField);
// Create the text field.
IField textField = new FieldClass();
IFieldEdit textFieldEdit = (IFieldEdit)textField;
textFieldEdit.Length_2 = 30; // Only string fields require that you set the length.
textFieldEdit.Name_2 = "Str_Att1";
textFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
fieldsEdit.set_Field(2, textField);
// Create the numeric field.
IField numericField = new FieldClass();
IFieldEdit numericFieldEdit = (IFieldEdit)numericField;
numericFieldEdit.Name_2 = "Num_Att1";
numericFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
fieldsEdit.set_Field(3, numericField);
//Create the SHAPE field.
IField shapeField = new FieldClass();
IFieldEdit shapeFieldEdit = (IFieldEdit)shapeField;
shapeFieldEdit.Name_2 = "SHAPE";
shapeFieldEdit.IsNullable_2 = true;
shapeFieldEdit.Required_2 = true;
IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
geometryDefEdit.AvgNumPoints_2 = 1;
geometryDefEdit.GridCount_2 = 0;
geometryDefEdit.HasM_2 = false;
geometryDefEdit.HasZ_2 = false;
//Depending on the feature type (ie. Point, Polyline, or Polygon)
//set the appropriate .Type_2 and .GeometryType_2 Properties.
if (shapeType == "points")
{
shapeFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
}
else if (shapeType == "polylines")
{
shapeFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
}
else if (shapeType == "polygons")
{
shapeFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
}
//Generate a default Spatial Reference
ISpatialReference spatialReference = MakeSpatialReference(esriSRProjCSType.esriSRProjCS_Sphere_AzimuthalEquidistant);
geometryDefEdit.SpatialReference_2 = spatialReference;
shapeFieldEdit.GeometryDef_2 = (GeometryDef)geometryDefEdit;
fieldsEdit.set_Field(4, shapeFieldEdit);
return fields;
}
///Helper to create a Feature Class.
public IFeatureClass CreateFeatureClass(IWorkspace workspace, IFeatureDataset featureDataset, System.String featureClassName, IFields fields, ESRI.ArcGIS.esriSystem.UID CLSID, ESRI.ArcGIS.esriSystem.UID CLSEXT, System.String strConfigKeyword)
{
if (featureClassName == "")
{
return null; // name was not passed in
}
featureClassName = "newShapeFile";
IFeatureClass featureClass = null;
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace; // Explicit Cast
// assign the class id value if not assigned
if (CLSID == null)
{
CLSID = new ESRI.ArcGIS.esriSystem.UIDClass();
CLSID.Value = "esriGeoDatabase.Feature";
}
System.String strShapeField = "";
// locate the shape field
//for (Int32 j = 0; j < fields.FieldCount; j++)
//{
// if (fields.get_Field(j).Type == esriFieldType.esriFieldTypeGeometry)
// {
// strShapeField = fields.get_Field(j).Name;
// }
//}
strShapeField = "SHAPE";
// finally create and return the feature class
// no feature dataset passed in, create at the workspace level
try
{
featureClass = featureWorkspace.CreateFeatureClass(featureClassName, fields, CLSID, CLSEXT, esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
}
catch (Exception ex)
{
String mess = ex.Message;
MessageBox.Show(mess);
}
return featureClass;
}
public ISpatialReference MakeSpatialReference(esriSRProjCSType coordinateSystem)
{
ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
//Create a projected coordinate system and define its domain, resolution, and x,y tolerance.
ISpatialReferenceResolution spatialReferenceResolution = spatialReferenceFactory.CreateProjectedCoordinateSystem(System.Convert.ToInt32(coordinateSystem)) as ISpatialReferenceResolution;
spatialReferenceResolution.ConstructFromHorizon();
ISpatialReferenceTolerance spatialReferenceTolerance = spatialReferenceResolution as ISpatialReferenceTolerance;
spatialReferenceTolerance.SetDefaultXYTolerance();
ISpatialReference spatialReference = spatialReferenceResolution as ISpatialReference;
return spatialReference;
}
private void AddShape(ref IFeatureClass FeatureClass, ref IWorkspace workspace, double azimuth, double fov, double range, double lat, double lon, double alt, String sensorID)
{
// Start an edit session and edit operation.
IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
workspaceEdit.StartEditing(true);
workspaceEdit.StartEditOperation();
int IDAttributeFieldIndex = FeatureClass.FindField("SensorID");
int StringAttributeFieldIndex = FeatureClass.FindField("Str_Att1");
int NumericAttributeFieldIndex = FeatureClass.FindField("Num_Att1");
ComReleaser comReleaser = new ComReleaser();
// Create a new insert cursor with buffering.
IFeatureCursor featureCursor = FeatureClass.Insert(true);
comReleaser.ManageLifetime(featureCursor);
// Create a feature buffer. This will store the values common to every
// feature to be installed.
IFeatureBuffer featureBuffer = FeatureClass.CreateFeatureBuffer();
comReleaser.ManageLifetime(featureBuffer);
IPolygon polygon = makePolygon(azimuth, fov, range, lat, lon, alt);
featureBuffer.Shape = (IGeometry)polygon;
featureBuffer.set_Value(IDAttributeFieldIndex, sensorID);
featureBuffer.set_Value(StringAttributeFieldIndex, "Try this");
featureBuffer.set_Value(IDAttributeFieldIndex, 2);
featureCursor.InsertFeature(featureBuffer);
// Flush the cursor.
featureCursor.Flush();
// All of the features were successfully inserted; stop the edit operation
// and stop the edit session, saving the changes made in edit operations.
workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(true);
}
#region "Build Polygon"
///
/// Takes input of azimuth field of view and range with position and altitude
/// to make a circular arc polygon to add as a symbol for element in layer.
///
///
///
///
///
///
///
/// IPolygon polygon
private IPolygon makePolygon(double azimuth, double fov, double range, double lat, double lon, double alt)
{
object missing = System.Reflection.Missing.Value;
//IZAware zAware;
IPolygon polygon = new PolygonClass();
IPoint centerPoint = new PointClass();
IPoint startPoint = new PointClass();
IPoint endPoint = new PointClass();
Boolean isCCW = true;
Boolean isMinor = false;
centerPoint.SpatialReference = MakeSpatialReference(esriSRProjCSType.esriSRProjCS_Sphere_AzimuthalEquidistant);
startPoint.SpatialReference = centerPoint.SpatialReference;
endPoint.SpatialReference = centerPoint.SpatialReference;
//zAware = centerPoint as IZAware;
////zAware.ZAware = true;
//zAware = startPoint as IZAware;
////zAware.ZAware = true;
//zAware = endPoint as IZAware;
////zAware.ZAware = true;
centerPoint.PutCoords(lon, lat);
////centerPoint.Z = alt;
double Xray = centerPoint.X;
double Yankee = centerPoint.Y;
ICircularArc circularArc = new CircularArcClass();
ISegmentCollection ring1 = new RingClass();
ring1.AddSegment(circularArc as ISegment, ref missing, ref missing);
double fovRadian = 0.0;
fovRadian = (fov * 2 * Math.PI) / 360;
circularArc.PutCoordsByAngle(centerPoint, GetFromAngle(azimuth, fov), fovRadian, range);
circularArc.QueryCoords(centerPoint, startPoint, endPoint, ref isCCW, ref isMinor);
ILine lineOut = new LineClass();
ILine lineIn = new LineClass();
lineOut.PutCoords(centerPoint, startPoint);
lineIn.PutCoords(endPoint, centerPoint);
ISegmentCollection segColl = new PolygonClass();
segColl.AddSegment((ISegment)lineOut, ref missing, ref missing);
segColl.AddSegment((ISegment)circularArc, ref missing, ref missing);
segColl.AddSegment((ISegment)lineIn, ref missing, ref missing);
polygon = segColl as IPolygon;
//IGeometryCollection geometryCollection = polygon as IGeometryCollection;
//geometryCollection.AddGeometry(segColl as IGeometry, ref missing, ref missing);
//geometryCollection.GeometriesChanged();
return polygon;
}
///
/// Converts Azimuth and Field of View width to geometric
/// start angle of circular arc.
///
///
///
/// Double startAngle
private double GetFromAngle(double azimuth, double FOV)
{
double startAngle = 0.0;
double fovRadian = 0.0;
fovRadian = (FOV * 2 * Math.PI) / 360;
startAngle = AzimuthToAngle(azimuth) - (.5 * fovRadian);
return startAngle;
}
///
/// Converts Azimuth to geometric angle of arc.
///
///
/// double angle
private double AzimuthToAngle(double azimuth)
{
double angle = 0.0;
double angleRadian = 0.0;
angleRadian = (azimuth * 2 * Math.PI) / 360;
angle = (2 * Math.PI) - (angleRadian - Math.PI / 2);
if (angle >= 2 * Math.PI)
{
angle -= 2 * Math.PI;
}
return angle;
}
private double ConvertMetersToDatasetUnits(IGlobe2 globe, double meters)
{
try
{
esriUnits units = globe.GlobeUnits;
IUnitConverter cvtr = new UnitConverter();
double mapUnits = cvtr.ConvertUnits(meters, esriUnits.esriMeters, units);
return mapUnits;
}
catch (Exception ex)
{
String mess = ex.Message;
return -1.0;
}
}
#endregion
}
}
|