POST
|
Hi, The documentation for the IGemetry.Project method : http://help.arcgis.com/en/sdk/10.0/arcobjects_cpp/componenthelp/index.html#/Project_Method/000w0000020r000000/ shows how an object can be projected into another coordinate space. Assuming that I am working with WGS84 referenced maps, I then want to draw a geometry (circle). In the case of WGS84, drawing a 'circle' (with constant radius), will actually be visualized (projected) as an ellipsoid - see attached image. My problem is that the following projection does not seem to be working : PointClass centroid = new PointClass() { X = 0, Y = 0}; PointClass permiterPoint = new PointClass() { X = 4, Y = 0 }; CircularArcClass circularArc = new CircularArcClass(); circularArc.PutCoords(centroid, permiterPoint, permiterPoint, esriArcOrientation.esriArcClockwise); IPolygon polygon = new PolygonClass(); segmentCollection = polygon as ISegmentCollection; segmentCollection.AddSegment(circularArc); ISpatialReferenceFactory srFactory = new SpatialReferenceEnvironmentClass(); IGeographicCoordinateSystem cs1 = srFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Clarke1880); IGeographicCoordinateSystem cs2 = srFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984); polygon.SpatialReference = cs1; polygon.Project(cs2); IGraphicTrackerSymbol graphicTrackerSymbol = graphicTracker.CreateSymbol(fillSymbol as ISymbol, null); int graphicID = graphicTracker.Add(polygon, graphicTrackerSymbol); (I have not added any maps yet, and have not set the any layer spacial relations). The 'inner' circle is the result of the code above. The 'outer' (shaded) ellipsoid is the result of another filled polygon (not in the code above) which is constructed by manually calculating the perimeter coordinates. The source coordinate system is obviously not Clarke 1880, I just set it to Clarke to try and get a response out of the Project method. What am I doing wrong in terms of the projection - why is the polygon not being projected into the ellipsical coordinates that are used to represent WGS 84?
... View more
04-30-2012
07:51 AM
|
0
|
16
|
3350
|
POST
|
Still can't find a solution for this one - even if we detect that the extent was changed, it still causes serious display issues to refresh twice (set the extent back to what it was) when there are large amounts of data involved. Please tell me there is a way to prevent arc objects from changing the extent when layers are added?
... View more
04-26-2012
06:37 AM
|
0
|
0
|
282
|
POST
|
Greetings, The custom application I am using relies on the OnExtentUpdated() event, which is called by ArcObjects whenever the map extent is updated. There seems no way to specify that this callback should only be triggered from actual user actions (i.e. pan and zoom) - and NOT when adding a map layer. A simple workaround would be to simply set a flag when adding a map layer and consequently not to handle the update event when it is triggered - but this has it's drawbacks : 1) I cannot guarantee that the flag will not accidentally ignore a user operation (for instance if a map is being added at the same time during runtime). 2) More importantly, map objects still sets the Extent object itself - which would require me to override the extent again - but that in turn would trigger the ExtentUpdated callback. Far too messy. The only alternative I can see at the moment : Ignore the ExtentUpdated event completely, manually intercept all user pan and zoom operations, and keep track of the map extent explicitly (i.e. ignore the ArcObjects extent, and only set it when it is required to set the extent programmatically). Please tell me there is a better way to gain more control over the map extent? Thanks.
... View more
04-13-2012
08:32 AM
|
0
|
2
|
538
|
POST
|
Sorted. Thanks for the help.
IGraphicTrackerSymbol graphicTrackerSymbol = graphicTracker.CreateSymbol(lineSymbol as ISymbol, null);
int graphicID = graphicTracker.Add(polyline, graphicTrackerSymbol);
... View more
04-02-2012
07:39 AM
|
0
|
0
|
594
|
POST
|
ok, got it now - I was getting confused with the other examples.
ISimpleFillSymbol fillSymbol = new SimpleFillSymbolClass();
RgbColorClass red = new RgbColorClass() { Red = 255, Green = 0, Blue = 0 };
fillSymbol.Color = red;
fillSymbol.Style = esriSimpleFillStyle.esriSFSSolid;
PointClass centroid = new PointClass();
PointClass fromPoint = new PointClass();
PointClass toPoint = new PointClass();
centroid.PutCoords(0, 0);
fromPoint.PutCoords(0, 10);
toPoint.PutCoords(10, 0);
CircularArcClass circularArc = new CircularArcClass();
circularArc.PutCoords(centroid, fromPoint, toPoint, esriArcOrientation.esriArcClockwise);
IPolyline polyline = new PolylineClass();
ISegmentCollection segmentCollection = polyline as ISegmentCollection;
segmentCollection.AddSegment(circularArc);
IGraphicTrackerSymbol graphicTrackerSymbol = graphicTracker.CreateSymbol(fillSymbol as ISymbol, null);
int graphicID = graphicTracker.Add(polyline, graphicTrackerSymbol);
This still doesn't display anything though (like the first and third code sample in my first post). feel like something else is fundamentally wrong? - The second code example is the only one that does not associate a geometry with the symbol, could that be the problem, that the GraphicTracker will not work with certain symbol geometry? (the viewing extent should be correct because when adding a marker symbol it is immediately visible at the correct location).
... View more
04-02-2012
07:05 AM
|
0
|
0
|
594
|
POST
|
Thanks for the suggestion, but ArcObjects throws an exception when trying to cast polyline to ISymbol :
IPolyline polyline = new PolylineClass();
ISegmentCollection segmentCollection = polyline as ISegmentCollection;
segmentCollection.AddSegment(circularArc);
ISymbol targetSymbol = (ISymbol)polyline;
{System.InvalidCastException: Unable to cast COM object of type 'ESRI.ArcGIS.Geometry.PolylineClass' to interface type 'ESRI.ArcGIS.Display.ISymbol'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{F3435802-5779-11D0-98BF-00805F7CED21}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)). I've tried doing the same in AfterDraw() - without using the graphic tracker, but get an exception when drawing directly to the map instead as well. Is there any other way to add an ellipse to the graphic tracker?
... View more
04-02-2012
06:29 AM
|
0
|
0
|
594
|
POST
|
Hi, This documentation : http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Using_a_GraphicTracker/0001000004tv000000/ provides some information about the graphic tracker. It states that the tracker only supports IPoint, IPolyline, and IPolygon geometry. Thanks to Neil's explanation (http://forums.arcgis.com/threads/54068-Extracting-elliptical-properties-from-TrackCircle%28%29-geometry) I understand how a polygon is several objects at once - it could represent a circular arc. In other words, we are able to create a circular arc (which could be a complete circle), and add it to the graphics tracker - but I'm having trouble with this - nothing is displayed, even though the call to add the graphic succeeds : ISimpleFillSymbol fillSymbol = new SimpleFillSymbolClass(); RgbColorClass red = new RgbColorClass() { Red = 255, Green = 0, Blue = 0 }; fillSymbol.Color = red; fillSymbol.Style = esriSimpleFillStyle.esriSFSSolid; IGraphicTrackerSymbol graphicTrackerSymbol = graphicTracker.CreateSymbol(fillSymbol as ISymbol, null); PointClass centroid = new PointClass(); PointClass fromPoint = new PointClass(); PointClass toPoint = new PointClass(); centroid.PutCoords(0, 0); fromPoint.PutCoords(0, 10); toPoint.PutCoords(10, 0); CircularArcClass circularArc = new CircularArcClass(); circularArc.PutCoords(centroid, fromPoint, toPoint, esriArcOrientation.esriArcClockwise); int graphicID = graphicTracker.Add(circularArc, graphicTrackerSymbol); mapControl.Refresh(); However, when displaying something else, like a character marker symbol, it displays correctly : ICharacterMarkerSymbol charSymbol = new CharacterMarkerSymbolClass(); charSymbol.CharacterIndex = 122; charSymbol.Color = new RgbColorClass() { Red = 15, Green = 255, Blue = 255 }; charSymbol.Font = tactFont; charSymbol.Size = 36; charSymbol.XOffset = 0; charSymbol.YOffset = 0; PointClass offset = new PointClass() { X = 0, Y = 0 }; IGraphicTrackerSymbol graphicTrackerSymbol = graphicTracker.CreateSymbol(charSymbol as ISymbol, null); int graphicID = graphicTracker.Add(offset, graphicTrackerSymbol); Does the tracker only display objects that do not have an associated geometry (i.e. the graphics tracker accepts a separate geometry object only to position the symbol)? I've found several references on the web which indicate that the first section of code (with the circular arc) should be working - can anyone explain what is wrong there? (similarly with Cartographic Symbol - nothing is displayed) : CartographicLineSymbolClass cartoSymbol = new CartographicLineSymbolClass(); cartoSymbol.Color = new RgbColorClass() { Red = 0, Green = 0, Blue = 255 }; cartoSymbol.Cap = esriLineCapStyle.esriLCSButt; cartoSymbol.Join = esriLineJoinStyle.esriLJSBevel; cartoSymbol.Width = 2; PointClass p1 = new PointClass() {X = 0, Y = 10}; PointClass p2 = new PointClass() {X = 10, Y = 0}; ILine line = new LineClass(); line.PutCoords(p1, p2); IEnvelope env = new EnvelopeClass() { XMin = -10, XMax = 10, YMin = -10, YMax = 10 }; IGraphicTrackerSymbol graphicTrackerSymbol = graphicTracker.CreateSymbol(cartoSymbol as ISymbol, null); int graphicID = graphicTracker.Add(env, graphicTrackerSymbol);
... View more
04-02-2012
04:42 AM
|
0
|
6
|
746
|
POST
|
ah, Excellent. thanks. your response was perfect, and also explains the methodology for handling other ArcObjects objects. In the mean time... (as is usually the case when one finds a solution), one finds another solution, staring me right in face! Figured out that the returned geometry can simply be queried for its bounding envelope, and consequently also the centroid.
IGeometry geometry = mapControl.TrackCircle();
double radius = geometry.Envelope.Width / 2;
IPoint centroid = ((EnvelopeClass)geometry.Envelope).Centroid;
... View more
03-29-2012
08:04 AM
|
0
|
0
|
410
|
POST
|
What is furthermore confusing, are the properties of the polygon (which the geometry claims to be, according to IGeometry.GeometryType) :
IGeometry geometry = mapControl.TrackCircle();
if (geometry.GeometryType == esriGeometryType.esriGeometryPolygon)
{
Polygon polygon = geometry as Polygon;
if (polygon.PointCount == 2)
{
string polyInfoStr = String.Format("Point 1 : [{0:f2}, {1:f2}]\nPoint 2 : [{2:f2},{3:f2}]", polygon.Point[0].X, polygon.Point[0].Y, polygon.Point[1].X, polygon.Point[1].Y);
MessageBox.Show(polyInfoStr);
}
}
Running the code above displays a message with 2 coordinates that are exactly the same. This would imply that the geometry returned from TrackCircle(), is actually a Polygon with two points, which have exactly the same coordinates. If the first coordinate were the centroid and the second point were the point on the circumference (representing the mouse up location for the track circle operation) then I would understand, but this is clearly not the case - I made sure that the tracked circle diameter spans a few thousand miles, but the returned coordinates are still equal. To clarify why I'm expecting different coordinates, the following code tracks a polyline, and display the points in a similar manner. They are displayed correctly:
IGeometry geometry = mapControl.TrackLine();
IPointCollection pointCollection = geometry as IPointCollection;
StringBuilder pointsInfoStr = new StringBuilder();
for (int pointIndex = 0; pointIndex < pointCollection.PointCount; pointIndex++)
{
IPoint curPoint = pointCollection.Point[pointIndex];
string pointInfo = String.Format("Point {0} : [{1:f2}, {2:f2}]", pointIndex + 1, curPoint.X, curPoint.Y);
pointsInfoStr.AppendLine(pointInfo);
}
MessageBox.Show(pointsInfoStr.ToString());
... View more
03-29-2012
04:30 AM
|
0
|
0
|
410
|
POST
|
Hi, Previously, in the wonderful adventures of Map Objects V2, getting the radius and centroid of a user tracked circle on the map was as easy as calling a line-liner: Ellipse ellipse = map.TrackCircle(); TheCakeIsReal(ellipse.Center, ellipse.radius); In Arc Objects 10, the universal forces of ESRI and Wheatley incorporated have decided to makes things a little more interesting. > Searched the forums for TrackCircle, but the 3 hits (http://forums.arcgis.com/search.php?searchid=997900) don't elaborate on extracting properties of the returned geometry. > The official API (http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#//001600000201000000) also has a wonderful little description : "TrackCircle returns a geometry object that implements IPolygon.". > Having a look at older forums (http://forums.esri.com/Thread.asp?c=159&f=1706&t=159785) brings me a bit closer to the lost treasure of Atlantis, but they are calling a method called 'SetGeometry' on CircleElement, which no longer exists in the ArcObjects 10 API... and has been wiped off the ISurface of existence. > I see that GeoEllipse is part of the Military Defence solutions extension - but I would like to be able to extract simple ellipse/circle properties without installing an extension to plan for world war 3. Tried the following to extract elliptical properties, but all three test candidates realize that the cake is a lie when they have to face the truth that they are not compatible with the returned geometry (polyline) : IPolygon polygon = mapControl.TrackCircle() as IPolygon; CircularArc circularArc = polygon as CircularArc; CircleElement circleElement = polygon as CircleElement; RubberCircle rubberCircle = polygon as RubberCircle; //... circularArc.CenterPoint ? //... circularArc.Radius ? Once again, could someone please point me in the right direction (for this apparently trivial operation)? Thanks!
... View more
03-29-2012
04:04 AM
|
0
|
3
|
552
|
POST
|
I've experienced similar trouble and posted a thread recently for this : http://forums.arcgis.com/threads/52090-Setting-the-mouse-cursor-in-a-custom-application It seems that ArcObjects overrides the application cursor with its own cursor property depending on which functionality is being invoked. Tracking a pan operation for instance, will cause ArcObjects to override the cursor (at each relevant internal event trigger) even if you set it explicitly for the application through DotNet. What we probably need is a way (interface) to specifically tell ArcObjects not to change the cursor when we don't want it to - or, to provide it with a set of cursor descriptions to use under which circumstances. My first guess was to use IMouseCursor:
IMouseCursor appCursor = new MouseCursorClass();
appCursor.SetCursor(2);
but IMouseCursor is only available for ArcDesktop (and even if it was available for Engine, I'm not sure if it would help). So the question remains, how can we get more accurate control over the mouse cursor?
... View more
03-19-2012
12:33 AM
|
1
|
0
|
307
|
POST
|
Thanks Neil - that certainly does work despite the stated requirement for 3DAnalyst (http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#/RasterSurfaceClass_Class/0009000001n3000000/) - which concerns me enough not to use this as a permanent solution. [rant] before continuing, could you please give me an honest opinion : I see you've been working with ArcObjects for at least 10 years now? - Did you experience the same difficulty trying to implement new features as I am now? Having worked in the application development industry for almost 10 years myself I certainly don't consider myself a blundering novice either - yet I find myself being incredibly frustrated by the amount of time I have to spend trying to search and sift through documentation and reply on forum support in order to accomplish something with ArcEngine... am I doing something wrong? If half my answers are coming from experienced developers or architects that have worked with ArcObjects before then perhaps I'm missing something important. [/rant] Back to the problem at hand: Also tried to implement IDataGraphT as you mentioned earlier, but ran into some confusing information: http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#//00120000034p000000 states that IDataGraphT is supported by ArcEngine... http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//00010000013w000000 states that a license for ArcView, ArcEditor or ArcInfo is required (no mention of ArcEngine) - the sample also shows an ArcView license being initialized in order to proceed. My own code is obviously initializing ArcEngine and fails as soon as I try to instantiate DataGraphT.
IDataGraphT dataGraphT = new DataGraphTClass();
"Retrieving the COM class factory for component with CLSID {58B570A4-02AE-44FC-B36F-630AE32EA4E4} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))." Either way, producing a polyline with height values from the raster dataset is already a huge step forward (can use this for an terrain elevation overlay). If there are no other means of creating a terrain profile as shown in the picture in the first post, then I'll have to stick with drawing everything manually using Windows GDI (as with Map Objects). Thanks again for the support.
... View more
03-15-2012
05:58 AM
|
0
|
0
|
565
|
POST
|
ok. Thanks to http://forums.arcgis.com/threads/52752-ArcEngine-DotNet-How-to-load-.hgt-files-into-a-dataset-and-then-elevation-ayer we now have a fully functional RasterDataset and RasterLayer, which were successfully tested with a RasterRenderer (UniqueValueRenderer) to display the SRTM height map on a map control. Excellent. Moving right along, your suggestion was to create a surface from the said layer. Taking a closer look at ISurface, it implements only RasterSurface and Tin. RasterSurface requires the 3DAnalyst extension (having to buy 3DAnalyst just for the terrain profile would be a bit unreasonable), and Tin requires the associated factory and workspace boilerplate architecture - which only reads in existing tin files. Is there any other sort of dedicated elevation profile interface which accepts raster elevation data as input?
... View more
03-14-2012
07:17 AM
|
0
|
0
|
565
|
POST
|
Thanks Neil and Charles, Your success with loading the file prompted me to double check my code again - and to my surprise the problem was exactly what Neil suggested in the first place : the pathname. (so I'm marking that as the solution) IRasterWorkspace rasterWorkspace = (IRasterWorkspace)workspaceFactory.OpenFromFile(folderPath, 0); expects a folder path. IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(filename); expects a filename (without path). One could probably argue that OpenFromFile is misleading (because we're passing a folder path, where the method name is suggesting a filename) - but the documentation does state that the parameter may be either filename or directory. I assume that the forum MVP's have had to suggest this on numerous occasions 🙂
... View more
03-13-2012
11:49 PM
|
0
|
0
|
303
|
POST
|
Much appreciated - thanks for the help thus far. It seems that the path I'm walking down is not very popular - ESRI undoubtedly wants customers to stick with their flagship products : ArcDesktop, View, Map etc. and customize them only when necessary - instead of using their own SDK to redevelop features. In our defence I must state that we are upgrading a product which used MapObjects 2.2 - and want to keep functional and interface changes to a minimum. My bad feeling at this point is that we're still going to be implementing a lot of features ourselves (e.g. terrain profile) if it turns out to be this difficult just to find out how to load STRM data into a data set.
... View more
03-13-2012
07:12 AM
|
0
|
0
|
1575
|
Title | Kudos | Posted |
---|---|---|
1 | 03-19-2012 12:33 AM |
Online Status |
Offline
|
Date Last Visited |
11-11-2020
02:23 AM
|