POST
|
Thank you Domenico, interesting article, I'tll keep this in mind for future but it turned out that the low SOE / Geoprocessing tool performance was related to changed data sources. We now totally changed our raster data sources to mosaic datasets and Image Services and therefore redesign to Image Service native functionality and ImageServer SOEs.
... View more
07-12-2019
04:51 AM
|
0
|
0
|
805
|
POST
|
Hello, at the moment I'm testing python scripts in ArcGIS Pro, a very basic technique. But because ArcGIS Pro 2.3 works with python 3.6 in my case, I wanted to structure my code a bit more leveraging classes, modules, packages. So my project structure is as follows: project_folder\ mypackage\ __init__.py process.py main.py my __init__.py import mypackage.process process.py looks as follows, note without classes !!! import arcpy
def run_process(param1, param2):
try:
arcpy.AddMessage(param1 + " " +param2)
except:
arcpy.AddError(arcpy.GetMessages(2)) in my main.py I do import mypackage.process as process and then in my code I call run_process() method: process.run_process('test', 'another test') Now this runs perfectly if I start the script from my IDE. I pass two arguments to a function with two parameters BUT once I call the script from within ArcGIS Pro -> Toolbox -> Script, I get the following error message: TypeError: run_process() takes 1 positional argument but 2 were given I can't get behind this error message and was researching on this problem a lot. Most occurences of such errors are related to method inside instances passing themself as additional first argument automatically but this shouln't be the case here. Moreover it tells me that my run_process() function would have only 1 parameter what is definetly not the case. The function takes 2 parameters! Can someone please help me to reproduce this?
... View more
07-12-2019
04:41 AM
|
0
|
5
|
6597
|
POST
|
Hello, I have a simple and basic question this time. Is it possible to disable/enable zoom with the sdk? It should have effect on navigate buttons as well as mouse wheel or any other zoom trigger actions. Thanks for help!
... View more
02-27-2019
05:19 AM
|
0
|
0
|
389
|
POST
|
Hi, I`m currently experiencing a strange behaviour with the SDK version 2.1. First I need to describe shortly what I'm trying to to. Inside my application I have a GPS position of a ship marked with an CIMPointSymbol inside the map. CIMCharacterMarker marker = SymbolFactory.Instance.ConstructMarker(
66,
"Schiff_real",
"Regular",
_config.ShipIconSize,
ColorFactory.Instance.BlackRGB) as CIMCharacterMarker;
marker.ScaleSymbolsProportionally = false;
return SymbolFactory.Instance.ConstructPointSymbol(marker); Later in the application I'm rotating the symbol based on the ships movement direction which is also aquired from gps information. _gpsPositionSymbol.SetAngle(targetCourseAngle) where targetCourseAngle is the negative value of true heading. Of course I checked the provided value is okay and GetAngle gives correct value back. This first seemed to work fine in application but now I was adding a second feature to the app, showing the current ship heading as a short helper line in front of the ship icon. The polyline is created by two points where target point is calculated by distance and direction from current ship position public static Polyline CreatePolyline(MapPoint startPoint, double direction, double distance)
{
// First convert line of sight direction (heading) into angle from positive x axis to positive y axis
double theta = 360 - direction + 90;
// Calculate target point by direction and distance
double new_x = startPoint.X + distance * Math.Cos(theta * Math.PI / 180);
double new_y = startPoint.Y + distance * Math.Sin(theta * Math.PI / 180);
// Construct target map point with input crs if available
MapPoint targetPoint = (MapPoint)MapPointBuilder.CreateMapPoint(new_x, new_y, (startPoint.SpatialReference != null) ? startPoint.SpatialReference : null);
return PolylineBuilder.CreatePolyline(new List<MapPoint> { startPoint, targetPoint }, startPoint.SpatialReference);
} The resulting Polyline also seems to be correct, the displayed angle looks good! I also double checked the calculation by var angle = Math.Atan2(new_y - startPoint.Y, new_x - startPoint.X) * (180 / Math.PI); with angle being positive degrees from positive x axis. However, if I display both symbol and heading line in the map, I have a slight shift in the directions. Symbol orientations and line direction are identical at full main directions 0°, 90°, 180°, 270° but diverge towards the middle of each quadrant. Please see the resulting effects in the attached images from east over south east to south. I can't see any mistake in my code and the divergence really only occures in the middle of each quadrant. Can someone reproduce this behaviour or help me out?
... View more
02-13-2019
05:02 AM
|
0
|
1
|
764
|
POST
|
Hi, I`m currently working on a more complex SOE process that runs on our latest ArcGIS Server version 10.6.1 much slower then ever before. The process includes several Raster Geoprocessing Functions which are time consuming and currently processed synchronously without 64 bit background processing. I would really like to migrate this to an asynchronous background process but I can't figure out how to bring this together. Async/await doesn't seem to work with the common SOE project layout. This is the major logic: RestOperation doMyJob = new RestOperation("doMyJob", new string[] { "param1", "param2", "param3", "param4", "param5", "param6", "param7", "param8" }, new string[] { "json" }, doMyJobOperationHandler);
private byte[] doMyJobOperationHandler(NameValueCollection boundVariables,
JsonObject operationInput,
string outputFormat,
string requestProperties,
out string responseProperties)
{
... do a lot of stuff here
return getCutFillAreas(p_strDatasetName, p_Polygon, b_dBaseZ, p_dZFactor, p_bCreateFC, p_strConstantRasterPath, p_strCutFillRasterPath, p_strClippedRasterPath);
}
private byte[] getCutFillAreas(string paramA, IPolygon4 polygon, double z, double zFactor, bool createFC, string constRasterPath, string cutFillRasterPath, string clippedRasterPath)
{
JsonObject resultJsonObject = new JsonObject();
...do a lot of stuff here
executeClipTool((IRaster) iGeoDataset, clippedRasterPath, clippingEnv)
...continue here after clipping is done
executeAnotherGeoprocessingTool();
...continue
return Encoding.UTF8.GetBytes(someJsonObject.ToJson());
}
private void executeClipTool(IRaster inRaster, string outRasterPath, IEnvelope rectangle)
{
Geoprocessor GP = new Geoprocessor();
Clip l_clipTool = new Clip();
l_clipTool.in_raster = inRaster;
l_clipTool.out_raster = outRasterPath;
l_clipTool.rectangle = Math.Round(rectangle.XMin, 0) + ", " +
Math.Round(p_rectangle.YMin, 0) + ", " +
Math.Round(p_rectangle.XMax, 0) + ", " +
Math.Round(p_rectangle.YMax, 0)
executeGeoprocessingTool(GP, l_clipTool, null);
} This is very simplified but it shows what I want to do. Basically I execute the tools synchronously and access results afterwards through file access. Now I want to have my main function getCutFillAreas to run executeClipTool() and other functions with Geoprocessor as asynchronous Tasks. I tried var result = executeClipToolAsync((IRaster) iGeoDataset, clippedRasterPath, clippingEnv).Result with a Task<T> approach Task<bool> clippingTask = Task.Factory.StartNew(() =>
{
return true;
}
return await clippingTask; but then I get Task error. Any help would be very appreciated!
... View more
11-23-2018
06:05 AM
|
0
|
2
|
1111
|
POST
|
Thank you once again for your ideas. From my current perspective the Scene Layer / Scene Service seems to be the best approach because we have some bigger data covering a whole state in Germany. Therefore we`re going to setup a Portal instance and the required data stores in the next days. In the Scene Layer are there performance differences due to the source of our data? I guess not because it gets cached anyway? Is there a list of supported data sources Layers in a SceneLayer / SceneService?
... View more
06-07-2018
11:19 PM
|
0
|
2
|
1483
|
POST
|
Hi Raluca Nicola, I assumed this wouldn't be possible at the moment and I was also thinking about a TIN solution. This would of course mean an information lost. We will discuss internally to determine our goals more specifically and maybe one of these approached will do for us. Is the SceneLayer also supported in the API or only in AGOL SceneViewer? I also did some research on this item and it seems to be a high effort to publish such a Scene Layer. In fact we don't want to upload or host the data twice in AGOL and as far as I know we don't have data stores in use right now. I'll keep this issue open. Maybe anyone else have an incredible good idea. But you get a big LIKE for your research and effort. Thank you!
... View more
06-06-2018
08:28 AM
|
2
|
4
|
1483
|
POST
|
Is this really impossible? Imagine a bunch of use cases like showing sub surface geological boundaries like faults or lithological boundaries. Or above the ground if you want to show a surface of maximum flood level, which is not always a plane surface. If this isn't possible, is there a workaround? I know I can have more then one GroundLayer while only one is the actual visible one. And I know I can show FeatureLayers relative to ground but that means always relative to the visible ground layer. Does noone have an idea?
... View more
06-04-2018
11:48 PM
|
1
|
0
|
1483
|
POST
|
Hi, actually I have a local scene view with a custom elevation service as ground layer. Now I would like to show other ImageServices from DEM MosaicDatasets/Caches as additional 3d surfaces (transparent) in the view. It seems I can always only render 1 ground layer at a time but I don`t want to have another ground layer. I want to have a second surface above the ground. Is this possible? And how can I set the raster rendering to let`s say a simple single color like red? Any help would be very appreciated!
... View more
06-04-2018
06:16 AM
|
1
|
7
|
1942
|
POST
|
Hello Rene, thank you for your explanations and links. The webpack plugin looks interesting, maybe I'll try this out in another project. For now I found another useful approach. I'm using gulp and gulp-ts-package to bundle the ts files into one js with amd modules. Then I just had to modify index.html a little bit. <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
<style>
html,
body {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<link rel="stylesheet" href="https://js.arcgis.com/4.7/esri/css/main.css">
<script src="https://js.arcgis.com/4.7"></script>
</head>
<body>
<script src="./app.js"></script>
<script>require(["hwrm/main"]);</script>
</body>
</html>
... View more
05-30-2018
02:29 AM
|
0
|
0
|
737
|
POST
|
Hello Typescript developers, I`ve developed a lot with Esri JavaScript both 3.x and 4.x and since developers are more and more encouraged to use TypeScript, I want to use it as well for an upcoming project. So I`ve started to play around with TypeScript - Setting up your development environment | ArcGIS API for JavaScript 4.7 which is very handy and easy to use for first tests. But what I need for deployment of my app is a bundled app.js. Is there a best practice guide how I can package modular code with Esri Types for production? I cannot get this to work with the example above. In the end it misses esri modules for me and I think it has something to do with esri dojo loader. A very simple description / build config for webpack or gulp would be absolutely amazing.
... View more
05-29-2018
08:03 AM
|
0
|
2
|
1226
|
POST
|
Hi James, I haven't tried this out but I think you have to use FeatureLayerView or execute a query on the FeatureLayer and create a layer for visualization from the results? FeatureLayerView | API Reference | ArcGIS API for JavaScript 4.7 var query = new Query({
geometry: wpGeometry,
spatialRelationship = "intersects"
});
// YOU CAN USE LAYERVIEW WHICH YOU CAN USE TO HOOK INTO LAYERS UPDATE EVENT
view.whenLayerView(this.funcLocLayer).then(function(lyrView){
lyrView.watch("updating", function(val){
if(!val){ // wait for the layer view to finish updating
lyrView.queryFeatures(query).then(function(results){
// Do additional stuff
});
}
});
});
// OR USE THE QUERY DIRECLY ON THE LAYER
this.funcLocLayer.queryFeatures(query).then(function(results){
// Create the final layer and add to map or update an existing layer
}); Let me know if this helps.
... View more
05-29-2018
07:51 AM
|
2
|
0
|
502
|
POST
|
I`ve been able to solve this on my own and I want to share my solution here. Probably it`s not the best one, so I`m open for improvements. import { subclass, declared, property } from 'esri/core/accessorSupport/decorators';
@subclass('hwrm.ExagerratedElevationLayer')
export class ExaggeratedElevationLayer extends declared(BaseElevationLayer) {
private _elevationLayer: ElevationLayer;
private _spatialReference: SpatialReference;
private _tileInfo: TileInfo;
private _fullExtent: Extent;
private _exaggeration: number;
private _elevationServiceURL: string;
@property()
get elevationLayer(): ElevationLayer {
return this._elevationLayer;
};
set elevationLayer(value: ElevationLayer) {
const oldValue = this._get < ElevationLayer > ("elevationLayer");
if (oldValue !== value) {
this._set("elevationLayer", value);
}
};
@property()
get spatialReference(): SpatialReference {
return this._spatialReference;
};
set spatialReference(value: SpatialReference) {
const oldValue = this._get < SpatialReference > ("spatialReference");
if (oldValue !== value) {
this._set("spatialReference", value);
}
};
@property()
get tileInfo(): TileInfo {
return this._tileInfo;
};
set tileInfo(value: TileInfo) {
const oldValue = this._get < TileInfo > ("tileInfo");
if (oldValue !== value) {
this._set("tileInfo", value);
}
};
@property()
get fullExtent(): Extent {
return this._fullExtent;
};
set fullExtent(value: Extent) {
const oldValue = this._get < Extent > ("fullExtent");
if (oldValue !== value) {
this._set("fullExtent", value);
}
};
@property()
get exaggeration(): number {
return this._exaggeration;
};
set exaggeration(value: number) {
const oldValue = this._get < number > ("exaggeration");
if (oldValue !== value) {
this._set("exaggeration", value);
}
};
@property()
get elevationServiceURL(): string {
return this._elevationServiceURL;
};
set elevationServiceURL(value: string) {
const oldValue = this._get < string > ("elevationServiceURL");
if (oldValue !== value) {
this._set("elevationServiceURL", value);
}
};
load(): IPromise < any > {
let elevationLayer: ElevationLayer = new ElevationLayer({
url: this._get < string > ("elevationServiceURL")
});
this._set("elevationLayer", elevationLayer);
return this.addResolvingPromise(this._get < ElevationLayer > ("elevationLayer").load());
};
fetchTile(level: number, row: number, col: number) {
return this._get < ElevationLayer > ("elevationLayer").fetchTile(level, row, col)
.then(function(data) {
data.values.forEach(function(value: number, index: number, values: number[]) {
console.log(this);
values[index] = value * this._get < number > ("exaggeration");
}.bind(this));
return data;
}.bind(this));
};
} I consumed my extended class like so: let exaggeratedElevationLayer: HwrmLayers.HwrmLayers.ExaggeratedElevationLayer = new HwrmLayers.HwrmLayers.ExaggeratedElevationLayer();
exaggeratedElevationLayer.elevationServiceURL = this._config.elevationServiceURL;
exaggeratedElevationLayer.exaggeration = 10;
exaggeratedElevationLayer.fullExtent = this._fullExtent;
exaggeratedElevationLayer.tileInfo = this._tileInfo;
exaggeratedElevationLayer.spatialReference = this._tileInfo.spatialReference;
this._map.ground.layers.add(exaggeratedElevationLayer); The 2 HwrmLayers in front derive from my individual code structure with import alias and namespace.
... View more
05-22-2018
11:47 PM
|
0
|
0
|
924
|
POST
|
Hi, in the past I was able to create a CustomElevationLayer with Exaggeration for an Esri Javascript 3D scene: Custom Elevation Layer with Exaggeration Now I would like ro realize the same task with Typescript. The general patterns to use Esri API in Typescript are clear but I'm struggling when it comes to: BaseElevationLayer.createSubclass({...}) TypeScript compiler tells me that Property 'createSubclass' does not exist on type 'BaseElevationLayerConstructor' and I can see this clearly in the TypeDefinitions. This method appears nowhere. So how can I create a custom ElevationLayer in Typescript? Does anybody has an idea?
... View more
05-22-2018
04:03 AM
|
0
|
1
|
1059
|
POST
|
Hi Leo, what you describe can not be fulfilled with that widget while its designed exactly for that usecase. Also further hooking into existing Esri widgets is by my experience not a good idea. For your intentions I only see the solution to get your data directly from the REST-service (RouteTask()) and build a nice little widget or module around it. We do this for most of our special needs that can`t be reached with out of the box esri widgets. Richard
... View more
03-14-2018
01:26 AM
|
0
|
0
|
658
|
Title | Kudos | Posted |
---|---|---|
1 | 06-04-2018 11:48 PM | |
1 | 06-04-2018 06:16 AM | |
1 | 10-29-2021 01:41 AM | |
1 | 01-22-2018 07:22 AM | |
1 | 09-29-2017 02:26 AM |
Online Status |
Offline
|
Date Last Visited |
08-15-2022
08:13 AM
|