POST
|
Howdy, I have a very simple python toolbox that takes in an excel sheet that contains lithology information and a kml/kmz file that contains borehole locations, processes them and appends them to a specified point and table featureclass. The tool works great in pro, with no issues. However, I published the tool out to my arcgis portal, published a point and table layer to go with it, wrapped them all up in a web app and it fails to add any information to the web layers. Does anyone here know what's going wrong? Code: import arcpy, os, openpyxl, shutil, time from arcgis.gis import GIS from arcgis.features import FeatureLayerCollection class Toolbox(object😞 def __init__(self😞 """Define the toolbox (the name of the toolbox is the name of the .pyt file).""" self.label = "Toolbox" self.alias = "toolbox" # List of tool classes associated with this toolbox self.tools = [BoreholeArchive] class BoreholeArchive(object😞 def __init__(self😞 """Define the tool (tool name is the name of the class).""" self.label = " Simple Borehole Archive Tool" self.description = "" self.canRunInBackground = False def getParameterInfo(self😞 """Define parameter definitions""" param0 = arcpy.Parameter( displayName="Input KML/KMZ File", name="input_kml", datatype="DEFile", parameterType="Optional", direction="Input") param1 = arcpy.Parameter( displayName="Input excel file", name="input_excel", datatype="GPType", parameterType="Required", direction="Input") param2 = arcpy.Parameter( displayName="Borehole point featuer layer to append", name="output_borehole_point", datatype="DEFeatureClass", parameterType="Optional", direction="Input") param3 = arcpy.Parameter( displayName="Table to append", name="output_lithology_table", datatype="DETable", parameterType="Required", direction="Input") params = [param0, param1, param2, param3] return params def isLicensed(self😞 """Set whether tool is licensed to execute.""" return True def updateParameters(self, parameters😞 """Modify the values and properties of parameters before internal validation is performed. This method is called whenever a parameter has been changed.""" return def updateMessages(self, parameters😞 """Modify the messages created by internal validation for each tool parameter. This method is called after internal validation.""" return def execute(self, parameters, messages😞 kml_kmz_filepath = parameters[0].valueAsText excel_filepath = parameters[1].valueAsText output_fc = parameters[2].valueAsText output_table = parameters[3].valueAsText # Get folder paths, do any work relating to temp files here arcpy.AddMessage("Starting") cwd = arcpy.env.scratchFolder temp_excel_file_path = os.path.join(cwd, "temp.xlsx") if os.path.exists(temp_excel_file_path😞 os.remove(temp_excel_file_path) kml_folder = os.path.join(cwd, "kml_conversion") if os.path.exists(kml_folder) == False: os.mkdir(kml_folder) kml_items = os.listdir(kml_folder) for kml_item in kml_items: if ".gdb" in kml_item: arcpy.Delete_management(os.path.join(kml_folder, kml_item)) else: os.remove(os.path.join(kml_folder, kml_item)) temp_gdb = os.path.join(cwd, "borehole_temp.gdb") if arcpy.Exists(temp_gdb😞 arcpy.Delete_management(temp_gdb) # clean row 1 of the excel file interval_column_names = ["0_5", "5_10", "10_15", "15_20", "20_25", "25_30", "30_35", "35_40", "40_45", "45_50", "50_55", "55_60"] # Create a copy of the input excel sheet shutil.copy(excel_filepath, temp_excel_file_path) wb1 = openpyxl.load_workbook(filename=excel_filepath) ws1 = wb1.worksheets[0] wb2 = openpyxl.load_workbook(filename=temp_excel_file_path) ws2 = wb2.create_sheet(ws1.title) for row in ws1: for cell in row: ws2[cell.coordinate].value = cell.value wb2.save(temp_excel_file_path) wb = openpyxl.load_workbook(temp_excel_file_path) sheet = wb.active i = 1 bid_tracker_no_column = 1 id_column = 2 # Clean column names current_interval = "" while i < sheet.max_column +1: cell = sheet.cell(1, i) column_name = cell.value column_name = column_name.strip() column_name = column_name.replace("'", "") column_name = column_name.replace(".", "") column_name = column_name.replace("-", "_") column_name = column_name.replace(" ", "_") column_name = column_name.replace("/", "_") if column_name == "Bid_Tracker_No": bid_tracker_no_column = i if column_name == "ID": id_column == i if column_name in interval_column_names: current_interval = column_name if current_interval == column_name: cell.value = "Int_{}".format(column_name) elif current_interval == "": cell.value = column_name else: cell.value = "Int_{}_{}".format(current_interval, column_name) i += 1 # Run through the spreadsheet and create the foriegn keys master_id_column = sheet.max_column +1 cell = sheet.cell(1, master_id_column) cell.value = "Bid_Tracker_No_and_ID" i = 2 while i < sheet.max_row + 1: id_cell = sheet.cell(i, id_column) bid_tracker_cell = sheet.cell(i, bid_tracker_no_column) master_id_cell = sheet.cell(i, master_id_column) if bid_tracker_cell.value and id_cell.value: master_id_cell.value = "{}-{}".format(bid_tracker_cell.value, id_cell.value) else: arcpy.AddWarning("Bad Bid_Tracker_No_and_ID in lithology layer, replace 99999 values with correct value") master_id_cell.value = 99999 i+=1 wb.save(temp_excel_file_path) # Create a temp gdb to hold temp data arcpy.management.CreateFileGDB(cwd, "borehole_temp.gdb") arcpy.env.workspace = temp_gdb # Convert the excel sheet into a gdb table lithology_table_path = os.path.join(temp_gdb, "Lithology") arcpy.conversion.ExcelToTable(temp_excel_file_path, lithology_table_path) # Add the tracking fields arcpy.AddField_management(lithology_table_path, "created_user", "TEXT") arcpy.AddField_management(lithology_table_path, "created_date", "DATE") arcpy.AddField_management(lithology_table_path, "last_edited_user", "TEXT") arcpy.AddField_management(lithology_table_path, "last_edited_date", "Date") # Update the online table arcpy.Append_management(lithology_table_path, output_table, "NO_TEST") arcpy.AddMessage("Lithology records added") # If a kml filpath is given then make the kml/kmz into a gdb and pull out the # needed information and push it into the temp gdbt if kml_kmz_filepath != None: arcpy.conversion.KMLToLayer(kml_kmz_filepath, kml_folder) arcpy.AddMessage("KML/KMZ converted") temp_folder_contents = os.listdir(kml_folder) kmz_gdb = "" for item in temp_folder_contents: if 'gdb' in item: kmz_gdb = os.path.join(kml_folder, item) kml_points_fc = os.path.join(kmz_gdb, "Points") # If the kml has been processed extract out the relevant information into a new point feature class # in the temp geodatabase if arcpy.Exists(kml_points_fc😞 new_points_fc = os.path.join(temp_gdb, "Boreholes") arcpy.CreateFeatureclass_management(temp_gdb, "Boreholes", "POINT") arcpy.CopyFeatures_management(kml_points_fc, new_points_fc) arcpy.AddField_management(new_points_fc, "Bid_Tracker_No_and_ID", "TEXT") arcpy.AddField_management(new_points_fc, "Bid_Tracker_No", "TEXT") arcpy.AddField_management(new_points_fc, "ID", "TEXT") arcpy.AddField_management(new_points_fc, "created_user", "TEXT") arcpy.AddField_management(new_points_fc, "created_date", "DATE") arcpy.AddField_management(new_points_fc, "last_edited_user", "TEXT") arcpy.AddField_management(new_points_fc, "last_edited_date", "Date") # Pull the information from Name and put it in Bid_Tracker_No_and_ID with arcpy.da.UpdateCursor(new_points_fc, ["Name", "Bid_Tracker_No_and_ID"]) as cursor: for row in cursor: if row[0] != None: row[1] = row[0] else: arcpy.AddWarning("Bad Bid_Tracker_No_and_ID in boreholes layer, replace 99999 values with correct value") row[1] = 99999 cursor.updateRow(row) del cursor arcpy.AddMessage("Primary Keys Created") # Delete unneeded fields # new_points_fc_fields = arcpy.ListFields(new_points_fc) # for field in new_points_fc_fields: # if field.name not in ["OBJECTID", "Shape", "Bid_Tracker_No", "ID", "Bid_Tracker_No_and_ID", "created_user", "created_date", "last_edited_user", "last_edited_date"]: # arcpy.DeleteField_management(new_points_fc, field.name) # arcpy.AddMessage("Extra KML/KMZ fields removed") # Since there was a kml update the web point layer arcpy.Append_management(new_points_fc, output_fc, "NO_TEST") arcpy.AddMessage("Borehole locations added") else: arcpy.AddWarning("No points found in kml/kmz, kml/kmz not processed") arcpy.AddMessage("Complete") time.sleep(10) return What it looks like in WAB pre run: After running:
... View more
02-24-2022
08:10 AM
|
0
|
0
|
540
|
POST
|
Hi everyone, I've been asked to work on a simple web app, but I'm a novice when it comes to the JS API and I'm having problems getting a basemap and layers up. Could anyone here help me out <!DOCTYPE html>
<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">
<title>Demo</title>
<link rel="stylesheet" href="https://js.arcgis.com/4.20/esri/themes/light/main.css">
<style>
html, body, #mapDiv {
padding: 0;
margin: 0;
height: 100%;
}
#textbox{
background-color: #fff;
box-shadow: 0 0 5px #888;
font-size: 1.1em;
max-width: 15em;
padding: 0.5em;
position: absolute;
right: 20px;
top: 20px;
z-index: 40;
}
</style>
<script src="https://js.arcgis.com/4.20/"></script> <!--wrong version?-->
<script>
require([
"esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer", "esri/Graphic", "esri/symbols/SimpleFillSymbol", "esri/symbols/SimpleLineSymbol", "esri/Color", "esri/geometry/Circle", "esri/rest/support/Query", "esri/geometry/Point", "esri/layers/GraphicsLayer"
], function(
MapView, FeatureLayer, Graphic, SimpleFillSymbol, SimpleLineSymbol, Color, Circle, Query, Point, GraphicsLayer, Map
) {
const feedlotFL = new FeatureLayer({
url: "https://arcgis.dnr.state.mn.us/arcgis/rest/services/ewr/practicum_feedlot/MapServer/0",
outFields: ["*"]
});
// Selected feedlots
const selectedFeedlotsGL = new GraphicsLayer();
// Map
const feedlotMap = new Map({
basemap: "arcgis-topographic", //wrong basemap type?
layers: [feedlotFL, selectedFeedlotsGL]
});
// View
const mapView = new MapView({
container: "mapDiv",
map: feedlotMap
});
mapView.on("click", evt => {
// TODO: Clear the graphics
const circleSymb = new SimpleFillSymbol(SimpleFillSymbol.STYLE_NULL,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SHORTDASHDOTDOT,
new Color([0, 0, 0]),2),
new Color([255, 255, 0, 0.25])
);
// Buffer type
const circle = new Circle({
center: evt.mapPoint,
radius: 25,
// geodesic: true,
radiusUnit: "feet"
});
const bufferGraphic = new Graphic(circle, circleSymb);
mapView.graphics.add(bufferGraphic);
let query = new Query({
geometry: mapView.toMap(evt),
distance: 25,
units: "feet",
spatialRelationship: "intersects",
returnGeometry: true,
outFields: ["*"]
});
feedlotFL.queryFeatures(query).then(response => {
document.getElementById('textbox').innerHTML = "<b>The number of feedlots within the buffer is <i>" + feedlotCount + "</i>.</b>"
const selectedFeedlots = [];
for (let i = 0; i < feedlotCount; i++) {
selectedFeedlots.push(response.features[i]);
}
addGraphics(selectedFeedlots);
function addGraphics(feedlots) {
feedlots.forEach(function(feature){
const eachSelectedFeedlotPt = new Graphic({
geometry: feature.geometry,
symbol: {
type: "simple-marker",
color: [0,0,0],
outline: {
width: 2,
color: [0,255,255],
},
size: "10px"
},
});
selectedFeedlotsGL.add(eachSelectedFeedlotPt);
});
}
});
});
});
</script>
</head>
<body>
<span id="textbox">Click on the map to select feedlots within 10 miles</span>
<div id="mapDiv"></div>
</body>
</html>
... View more
09-07-2021
06:53 PM
|
0
|
4
|
879
|
POST
|
Here's my problem I have a script that generates shapefiles, pushes them to AGOL, symbolizes them, and creates and adds them to a webmap. I need to be able to programmatically add labels to the new webmap, but I've been unable to find a clear answer on how to do it. The JSONs that provide the symbology to the feature service have "showLabels" set to true, but that doesn't work, I tried creating a fully symbolized and labeled map to generate a JSON and using that to update my maps, but that doesn't work, any help would be appreciated.
... View more
11-25-2020
08:17 AM
|
0
|
1
|
797
|
POST
|
I figured it out, the datasets were too big so I wrote a function to break up the data and push those groups up.
... View more
09-06-2020
06:53 PM
|
0
|
0
|
1097
|
POST
|
Hi all, so I'm having some trouble with using the python api. I'm getting code 10054 when it goes to push data to AGOL and I can't figure out why. import os, datetime, sys, traceback, time, arcpy, arcgis from arcgis.gis import GIS # Logging function to keep track of activity and errors def Logger(logMessage😞 try: with open("Log.txt", "a") as logFile: logFile.write("\n{0} ; {1}".format(logMessage, datetime.datetime.now().strftime("%H:%M:%S , %m/%d/%Y"))) except Exception as ex: print("Activity logging failed {}".format(ex)) def TruncateWebLayer(gis=None, target=None😞 try: lyr = arcgis.features.FeatureLayer(target, gis) lyr.manager.truncate() except: print("Failed truncating: " + str(target)) sys.exit() # User input dialog, note raw input for the file paths userContinue = "N" priorityMarkShpPath = input("Priority Mark Shapefile Path: ") hex10kmShpPath = input("10km Hex Bin Shapefile path: ") hex2kmShpPath = input("2km Hex Bin Shapefile path: ") userContinue = input("Continue Y/N: ") if userContinue in ("N", "n", "no"😞 sys.exit(0) try: if os.path.exists(hex10kmShpPath) and os.path.exists(hex10kmShpPath) and os.path.exists(priorityMarkShpPath): # Convert the input shapefiels into JSON print("Converting Shapefiles to JSON, this may take some time...") priorityMarkShpJSONResult = arcpy.FeaturesToJSON_conversion(priorityMarkShpPath, "priorityMarkShpJSON.json", "FORMATTED") hex10kmJSONResult = arcpy.FeaturesToJSON_conversion(hex10kmShpPath, "hex10kmJSON.json", "FORMATTED") hex2kmJSONResult = arcpy.FeaturesToJSON_conversion(hex2kmShpPath, "hex2kmJSON.json", "FORMATTED") # Create a FeatureSet objects using the API from the JSONs priorityMarkNew = arcgis.features.FeatureSet.from_json(open("priorityMarkShpJSON.json").read()) hex10kmNew = arcgis.features.FeatureSet.from_json(open("hex10kmJSON.json").read()) hex2kmNew = arcgis.features.FeatureSet.from_json(open("hex2kmJSON.json").read()) # URLs to individual layers of the service priorityMarkURL = r"#####" hex10kmURL = r"#####" hex2kmURL = r"#####" print("Logging into AGOL...") gis = GIS(url = "#####", username = "#####", password = "#####") gpsOnBmTestFS = gis.content.get("#####") foo = gpsOnBmTestFS[0].properties.capabilities # Remove all features from the existing web layers print("Truncating existing web layers...") TruncateWebLayer(gis, priorityMarkURL) TruncateWebLayer(gis, hex10kmURL) TruncateWebLayer(gis, hex2kmURL) # Reference the empty layers priorityMarkEmptyFl = arcgis.features.FeatureLayer(priorityMarkURL, gis) hex10kmEmptyFl = arcgis.features.FeatureLayer(hex10kmURL, gis) hex2kmEmptyFl = arcgis.features.FeatureLayer(hex2kmURL, gis) # Now add those featureset objects to the empty web layers # error happens here print("Publishing new Layers...") priorityMarkEmptyFl.edit_features(adds = priorityMarkNew) time.sleep(5) hex10kmEmptyFl.edit_features(adds = hex10kmNew) time.sleep(5) hex2kmEmptyFl.edit_features(adds = hex2kmNew) print("Completed Successfully") else: sys.exit("Invalid files please try again") except Exception as ex: print("Error see log for traceback") Logger(traceback.format_exc()) finally: print("Deleting Temp Files...") if os.path.exists("priorityMarkShpJSON.json"😞 os.remove("priorityMarkShpJSON.json") if os.path.exists("hex10kmJSON.json"😞 os.remove("hex10kmJSON.json") if os.path.exists("hex2kmJSON.json"😞 os.remove("hex2kmJSON.json")
... View more
08-31-2020
03:29 PM
|
0
|
3
|
1152
|
POST
|
Hi all, So here's my problem, I have a script that is generating new shapefiles, those shapefiles are layers in one feature service on AGOL. I want to write a script using the python API to automate this task, but I'm having trouble finding a clear way to do this. Has anyone done this or know how to?
... View more
08-28-2020
12:39 PM
|
0
|
1
|
395
|
POST
|
Hi everyone, I'm working on an AR app using .net Runtime, I want to be able to see monitoring wells in place in world scale AR. I've got pretty much everything working just fine, but I can't seen to be able to extrude my wells below the surface. Does anyone know how to do this? My code is below _wellsLayer.RenderingMode = FeatureRenderingMode.Dynamic; SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbolStyle.Circle, Color.Blue, 0.25); SimpleRenderer wellRenderer = new SimpleRenderer(pointSymbol); wellRenderer.SceneProperties.ExtrusionMode = ExtrusionMode.AbsoluteHeight; wellRenderer.SceneProperties.ExtrusionExpression = "[Depth] * -1"; _wellsLayer.Renderer = wellRenderer;
... View more
04-12-2020
09:52 AM
|
0
|
0
|
400
|
POST
|
The resulting URI takes me here ArcGIS Portal Directory so that to me doesn't look like a valid endpoint, but it is consistent with this resource explaining how to add data Access portal content—ArcGIS Runtime SDK for .NET | ArcGIS for Developers. Maybe it has to do with loading the data? I followed the guide here on how to that Features and graphics—ArcGIS Runtime SDK for .NET | ArcGIS for Developers
... View more
04-08-2020
05:11 PM
|
0
|
2
|
1523
|
POST
|
Thanks, that cleared up the 403 error but now it comes back with a "\"invalid call with current token type\" error, error code 6001
... View more
04-08-2020
02:11 PM
|
0
|
4
|
1523
|
POST
|
Hi guys, So I'm working on an augmented reality mobile app, it's real basic, I just want to see monitoring wells in place. Anyway I am using my monitoring well dataset in AGOL and I am having trouble accessing the data, below is the C# code that is attempting to access the data. _portal = await ArcGISPortal.CreateAsync(baseAddress, cred); _envWorkingData = await PortalItem.CreateAsync(_portal, "####"); // build a URL to the first layer in the service var welluri = new Uri(_envWorkingData.Url + "/1"); // create a new service feature table referencing the service var wellTable = new ServiceFeatureTable(welluri); // create a new feature layer from the table await wellTable.LoadAsync(); <- Here is where the access error shows up if(wellTable.LoadStatus == Esri.ArcGISRuntime.LoadStatus.Loaded) { _wellsLayer = new FeatureLayer(wellTable); } I get error #403 "You do not have permissions to access this resource or perform this operation.", even though I have a publisher level AGOL account. Any ideas?
... View more
04-05-2020
10:15 AM
|
0
|
6
|
1617
|
POST
|
Howdy all, So I'd like to be able to use related records in geoprocessing. What I have are field staff out in the field gathering water elevation records in survey123 which then submits to a related table tied to the well layer that they are measuring creating a classic one - many relationship. I'd like to be able to access those measurements when I run a kriging operation, however it appears the only thing I can do with related records is view them, which is essentially useless. I could write a script to replicate a proper Join and return a feature layer with the updated values, but that creates an orphan data problem. Does anyone know a way to do what I want to do?
... View more
01-29-2020
11:02 AM
|
0
|
0
|
349
|
POST
|
Howdy, I have a hosted layer I want to join a local table to. I add the hosted layer in arcmap (10.5) and join the local table to it (in a local file geodatabase). Every time I try this the join goes through fine but all the data becomes inaccessible. I'm guessing a truly successful join is impossible, but I'm curious if anyone has ever done this and gotten it to go through.
... View more
12-14-2019
08:10 AM
|
0
|
1
|
378
|
POST
|
Depending on your university? The student and personal versions are the same.
... View more
12-12-2019
05:11 PM
|
0
|
1
|
510
|
POST
|
Howdy, I renewed my student version of arc pro, but it won't authorize, I tried the single use authorization and it went through sucessful but pro is still not authorized, I also tried to authorize through AGOL and that failed as well. Any thoughts?
... View more
12-12-2019
04:33 PM
|
0
|
3
|
576
|
Title | Kudos | Posted |
---|---|---|
1 | 03-13-2019 12:28 PM | |
1 | 05-01-2018 04:29 PM | |
1 | 06-07-2017 12:21 PM | |
1 | 02-24-2019 06:40 PM | |
3 | 11-11-2019 08:47 AM |
Online Status |
Offline
|
Date Last Visited |
02-24-2022
08:12 AM
|