DOC
|
Hey Tim, Thank you for responding. I think yes? I think your widget operates on the premise that it is geocoding (correct me if I am wrong), unless it is to far away from an address. I also think it is off of a road segment, right? I could see using it for, basically the "Go To XY" tool in desktop. You punch in coordinates and that is what is returned, regardless of an address. Instead, listing the coordinates in the pop up would be great. An example is a quick check for a crane on a property against an elevation data set, in my case a contour layer. The Zoning Administrator would then make a quick determination if that crane is going to violate any height ordinances to issue a permit, and then print out a map with the returned XY. David
... View more
06-15-2015
06:07 AM
|
0
|
0
|
8069
|
DOC
|
This widget is great. I have a lot of potential uses for it, so thank you for sharing. I am not sure how hard it would be or if it is even possible as i am not a developer like a lot of you, but is it possible to return just the entered coordinates? By that I mean not snapping it to an address point, but letting the point be where the entered coordinates are?
... View more
06-10-2015
02:07 PM
|
0
|
0
|
8069
|
POST
|
Sorry about that. Thanks for the catch Robert. The code should be there now.
... View more
04-27-2015
06:24 AM
|
0
|
0
|
585
|
POST
|
I am working on phase two of a project that requires users to log progress on a reported incident or concern. I know it is possible to edit related records via the javascript api as the api has this section on it: Query and edit related records | ArcGIS API for JavaScript . I also know the collector has this ability, but not all of my users will be in the field needing to update their progress. I have figured out how most of the example works, but I am not sure how to modify it to get it to what I need it to do. My goals are to have the users only be able to search for a particular incident by an incident number, then add related records to track their progress on that incident, and finally edit only one field on the feature itself to signify if it is closed. Below is what I have come up with so far. I am just trying to get the edit a related record to work, by taking the example and modifying it. I know chunks either need to come out or be modified especially part with the "numPeople" to make it work. Any help or pointers would be greatly appreciated. <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!--The viewport meta tag is used to improve the presentation and behavior of the samples
on iOS devices-->
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
<title>Incident Follow Up Entry</title>
<link rel="stylesheet" href="http://js.arcgis.com/3.13/dijit/themes/claro/claro.css">
<link rel="stylesheet" href="http://js.arcgis.com/3.13/esri/css/esri.css">
<style>
html, body {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
body {
background-color:#fff;
overflow:hidden;
}
#header{
border:solid 2px #AAc4c4;
background:#fff;
color:#749749;
border-radius: 4px;
font-size:14px;
padding-left:20px;
font-weight:700;
}
#map{
padding:1px;
border:solid 2px #AAc4c4;
border-radius: 4px;
}
#leftPane{
width: 120px;
border: solid 2px #AAc4c4;
border-radius: 4px;
}
.templatePicker {
border: none;
}
.dj_ie .infowindow .window .top .right .user .content { position: relative; }
.dj_ie .simpleInfoWindow .content {position: relative;}
</style>
<script src="http://js.arcgis.com/3.13/"></script>
<script>
var widget;
var selected;
var map;
var updateRelatedRecord; //Was the name voteOnIncident
require([
"esri/map",
"esri/toolbars/edit",
"esri/graphic",
"esri/tasks/RelationshipQuery",
"esri/layers/ArcGISTiledMapServiceLayer",
"esri/layers/FeatureLayer",
"esri/symbols/SimpleMarkerSymbol",
"esri/dijit/editing/Editor",
"esri/dijit/editing/TemplatePicker",
"esri/config",
"esri/request",
"dojo/_base/array",
"esri/Color",
"dojo/parser",
"dojo/dom",
"dijit/layout/BorderContainer", "dijit/layout/ContentPane",
"dojo/domReady!"
], function(
Map, Edit, Graphic, RelationshipQuery,
ArcGISTiledMapServiceLayer, FeatureLayer,
SimpleMarkerSymbol,
Editor, TemplatePicker,
esriConfig, esriRequest,
arrayUtils, Color, parser, dom
) {
parser.parse();
// refer to "Using the Proxy Page" for more information: https://developers.arcgis.com/javascript/jshelp/ags_proxy.html
esriConfig.defaults.io.proxyUrl = "/proxy/";
var map = new Map("map", {
basemap: "streets",
center: [-90.173, 44.667],
zoom: 13
});
map.on("layers-add-result", initEditing);
var incidentLayer = new FeatureLayer(".../rest/services/CitizenServiceRequest/CRSRelatedRecords/FeatureServer/0", {
mode: FeatureLayer.MODE_ONDEMAND,
outFields: ["*"],
id: "incidentLayer"
});
incidentLayer.setSelectionSymbol(
new SimpleMarkerSymbol().setColor(new Color("red"))
);
map.addLayers([incidentLayer]);
//working around an arcgis server feature service bug. Requests to queryRelatedRecords operation fail with feature service 10.
//Detect if request conatins the queryRelatedRecords operation and then change the source url for that request to the corresponding mapservice
esriRequest.setRequestPreCallback(function(ioArgs) {
if (ioArgs.url.indexOf("queryRelatedRecords") !== -1) {
ioArgs.url = ioArgs.url.replace("FeatureServer", "MapServer");
}
return ioArgs;
});
function initEditing() {
map.infoWindow.resize(250,210);
var incidentLayer = map.getLayer("incidentLayer");
generateTemplatePicker(incidentLayer);
map.on("click", function(evt) {
if (selected) {
// var currentDate = new Date();
var incidentAttributes = {
GENERALISSUE: selected.template.name,
// req_date:(currentDate.getMonth() + 1) + "/" + currentDate.getDate() + "/" + currentDate.getFullYear(),
// address: "",
// district: "",
STATUS: ""
};
var incidentGraphic = new Graphic(evt.mapPoint, selected.symbol, incidentAttributes);
incidentLayer.applyEdits([incidentGraphic],null,null);
}
});
var title, content, graphicAttributes;
var relatedQuery = new RelationshipQuery();
relatedQuery.outFields = ["ACTIONTAKEN","ACTIONCOMMENTS","TIMEALLOWANCE","STAFFASSIGNED","STAFFTASK", "UPDATECOMMENTS", "STATUS", "RESOLVEDDATE"];
relatedQuery.relationshipId = 1;
incidentLayer.on("click", function(evt) {
graphicAttributes = evt.graphic.attributes;
title = graphicAttributes.GENERALISSUE;
content = "<b>Status: </b>" + graphicAttributes.STATUS
+ "<br><b>Start of Incident: </b>" + graphicAttributes.STARTOFISSUEDATE
+ "<br><b>Private Property Concern: </b>" + graphicAttributes.PRIVATEPROPERTY
+ "<br><b>Public Services Concern: </b>" + graphicAttributes.PUBLICSERVICES
+ "<br><b>Public Streets Concern: </b>" + graphicAttributes.PUBLICSTREETS
+ "<br><b>Public Sidewalks Concern: </b>" + graphicAttributes.PUBLICSIDEWALKS
+ "<br><b>Parks/Zoo/Trails Concern: </b>" + graphicAttributes.PARKSZOOTRAILS
+ "<br><b>Private Signage Concern: </b>" + graphicAttributes.PRIVATESIGNAGE
+ "<br><b>Drainage Conern: </b>" + graphicAttributes.DRAINAGECONCERNS
+ "<br><b>Unauthorized Dumping Concern: </b>" + graphicAttributes.UNAUTHORIZEDDUMPING
+ "<br><b>Description: </b>" + graphicAttributes.DESCRIPTION
+ "<br><b>Contact's First Name: </b>" + graphicAttributes.CFNAME
+ "<br><b>Contact's Last Name: </b>" + graphicAttributes.CLNAME
+ "<br><b>Contact's Address: </b>" + graphicAttributes.CADDRESS
+ "<br><b>Contact's Phone: </b>" + graphicAttributes.CPHONE
+ "<br><b>Contact's Email: </b>" + graphicAttributes.CEMAIL
+ "<br><b>Preferred Method of Contact: </b>" + graphicAttributes.CONTACTME;
relatedQuery.REQUESTID = [graphicAttributes.REQUESTID];
incidentLayer.queryRelatedFeatures(relatedQuery, function(relatedRecords) {
var followUpRecords = relatedRecords[graphicAttributes.REQUESTID];
// var fset = relatedRecords[graphicAttributes.objectid];
// var count = (fset) ? fset.features.length : 0
content = content; //+ "<br><hr><br><i><span id='numPeople'>" + count + "</span> people think this is important.</i>"
content = content + "<br><br><img style='cursor:pointer' src='images/thumbsup.jpeg' onclick='updateRelatedRecord(" + graphicAttributes.REQUESTID + ");'>"; //onclick='voteOnIncident
map.infoWindow.setTitle(title);
map.infoWindow.setContent(content);
map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint));
});
});
}
updateRelatedRecord = function(objectId) {
var updateRecord = {
attributes: {
REQUESTID: REQUESTID,
ACTIONTAKEN:""
ACTIONTAKEN:""
ACTIONCOMMENTS:""
TIMEALLOWANCE:""
STAFFASSIGNED:""
STAFFTASK:""
UPDATECOMMENTS:""
STATUS: "Assigned"
}
};
// I have no idea about this? Do I need this?
var incidentTable = new FeatureLayer(".../rest/services/CitizenServiceRequest/CRSRelatedRecords/FeatureServer/1");
incidentTable.applyEdits([updateRecord], null, null,
function(addResults) {
var numPeople = dom.byId("numPeople").innerHTML;
dom.byId("numPeople").innerHTML = parseInt(numPeople, 10) + 1;
}, function(err){
alert(err);
}
);
};
function generateTemplatePicker(layer) {
console.log("layer", layer);
widget = new TemplatePicker({
featureLayers: [ layer ],
rows: layer.types.length,
columns: 1,
grouping: false,
style: "width:98%;"
}, "templatePickerDiv");
widget.startup();
widget.on("selection-change", function() {
selected = widget.getSelected();
console.log("selected", selected);
});
}
});
</script>
</head>
<body class="claro">
<div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="gutters:true, design:'headline'" style="width:100%;height:100%;">
<div
... View more
04-23-2015
12:46 PM
|
0
|
4
|
4004
|
POST
|
Sebastian, I have a few questions as I am super new to the Javascript world. I am working on a project where the user needs to find an incident by either searching for a request id or a logger's name, then log follow up records to an incident, and once that incident is resolved change the status on the feature to closed. From what I gather above and figuring out what javascript I can, your code is meant to search for something, update a feature's attributes, as well as create new related records. Is that correct? Your code is the closest I have come to seeing something like what I want to do. How hard would it be to modify what you already wrote to fit the scenario I listed above? Basically one feature class with one related table for records, with the ability to edit the feature class and add new related records. While having the ability to search for the incident. Suggestions would be most helpful. Thank you David
... View more
04-21-2015
01:56 PM
|
0
|
1
|
1242
|
POST
|
After meeting with departments, and compiling their feedback. What in the code above would need to be modified so that it runs against a single department, and writes to already created file? Basically, we do not want to spam our departments, nor override all the files at the same time especially if their is no new request. We are thinking of using triggers on the database to run the script against a new entry, and immediately notify that a department. Any issues with that?
... View more
12-03-2014
02:12 PM
|
0
|
0
|
1137
|
POST
|
Xander, Thank you very much. I ran it, tested, and it worked like a charm. I will spend some time to truly understanding what is all going on in the script you posted. Thank you again for helping out a newbie at python scripting.
... View more
08-25-2014
11:06 AM
|
0
|
6
|
937
|
POST
|
Xander, I now get a different error message: Traceback (most recent call last): File "C:\Python27\ArcGIS10.1\Lib\site-packages\Pythonwin\pywin\framework\scriptutils.py", line 326, in RunScript exec codeObject in __main__.__dict__ File "F:\Home\GIS\Depts\PD\proj\ActiveWarrants\Test2.py", line 39, in <module> insertCursor.insertRow(r) TypeError: value #1 - unsupported type: tuple Any thoughts?
... View more
08-25-2014
09:10 AM
|
0
|
9
|
3375
|
POST
|
Xander, source = "//fdrive/GIS/Depts/PD/proj/ActiveWarrants/ActiveWarrants.gdb/MAW_Geocode" destination = "//fdrive/GIS/Depts/PD/proj/ActiveWarrants/SDE to MFLDSQL4.sde/CoMGIS.SDE.Warrants" fieldName = "WarrentNumber" The field is a text field. The intermediate geodatabase is a file geodatabase.
... View more
08-25-2014
08:31 AM
|
0
|
0
|
3375
|
POST
|
Riyas, Thank you for the script. After seeing what is going on, I have a better understanding of what is going on. Hopefully, I will be able to apply this knowledge in the future. When I run the script with the changed parameters, I get a run time error of "An invalid SQL statement was used. [MAW_Geocode]". MAW_Geocode is the source parameter (the intermediate file geodatabase feature class). It hits in the line: for r in insertRows: insertCursor.insertRow(r) Any suggestions?
... View more
08-25-2014
07:38 AM
|
0
|
12
|
3375
|
POST
|
Riyas, Thank you for confirming what I need to do. I get the concepts, but do not know how to get there. I do have a primary field, which would be the Warrant ID. It looks like 2007-031. I looked at the List Difference link you sent, and did more digging. I guess I am not seeing how to do this. This is by the far the most advanced thing I have attempted to tackle.
... View more
08-22-2014
09:30 AM
|
0
|
14
|
3375
|
POST
|
I am trying to automate the production of a feature class with daily updates. I would like to use a Python Script do this. The basic concept is there is a SQL table that is updated with addresses, the script needs to pull that table into a intermediate file geodatabase, geocoded it, compare the geocoded results to the existing SDE feature class, and remove any old entries from the SDE feature class, append any new features, and leave alone any that are the same. I get the first chunk of my script to do what I want it to do. When I get to the compare and update part, my initial line of thinking will not work in all cases (especially when there are only removals). I know there has to be a more elegant way of doing the compare and update portion. Any suggestions? This is what the portion that does not work all the time: # Put in error trapping in case an error occurs when running tool CoMGIS_SDE_Warrants = #Path to SDE Feature Class try: # Make a layer from the feature class arcpy.MakeFeatureLayer_management(MAW_GeoCode,"newCompare_lyr") # Selecting all existing features arcpy.SelectLayerByLocation_management("newCompare_lyr", "INTERSECT", CoMGIS_SDE_Warrants, "", "NEW_SELECTION") # Selecting only new features arcpy.SelectLayerByLocation_management("newCompare_lyr", "INTERSECT", CoMGIS_SDE_Warrants, "", "SWITCH_SELECTION") # Write the selected features to a new featureclass arcpy.Append_management("newCompare_lyr", CoMGIS_SDE_Warrants,"TEST","","") arcpy.Delete_management("newCompare_lyr") # Make a layer from the Existing Features arcpy.MakeFeatureLayer_management(CoMGIS_SDE_Warrants,"existCompare_lyr") # Selecting all existing features arcpy.SelectLayerByLocation_management("existCompare_lyr", "INTERSECT", MAW_GeoCode, "", "NEW_SELECTION") # Selecting only Non-Active Warrants arcpy.SelectLayerByLocation_management("existCompare_lyr", "INTERSECT", MAW_GeoCode, "", "SWITCH_SELECTION") # Delete Non-Active Warrants arcpy.DeleteFeatures_management("existCompare_lyr") arcpy.Delete_management("existCompare_lyr") except: print arcpy.GetMessages() print "Success"
... View more
08-21-2014
01:15 PM
|
0
|
16
|
11214
|
POST
|
Thanks Paul. This definitely helps and thanks for the links. We'll see where this project goes from here. I am sure it will morph from the initial request.
... View more
06-25-2014
05:34 AM
|
0
|
0
|
1137
|
POST
|
The setup is we currently do not have an automated work order system in place. IT has approached me to build an internet GIS based service request application, of which the local government model template "Citizen Service Request" works for what we want it to do. On the back end I am scripting out how to update the features from unassigned to assigned after creating some .csv/.txt files to attach to emails sent via SQL Server Business Intelligence Development Studio. I have put together the python code below as a proof of concept before switching out the necessary items for our SDE database. This will be a stand-alone script running on the server at a regular interval (if that matters? Suggestions?). My questions are: 1) I get it to produce an intermediate table based on if the STATUS field has the value 'Unassigned'. I would like to take it a step further and have it parse out based on request type, and the unassigned status. Example would be: potholes, street sign damage, and debris in road to be written to one table. Sidewalk damage, weeds, and graffiti to another, and so on till I get the attachments for the group of people I need to send them to. Is there an elegant way of doing that or do I need to have multiple table to table conversions and expressions? 2) Right now it converts that one table to a text file that can be added as an attachment in the email. I would like to take it to the next level, which is to convert the created tables from question 1. I would assume I could just copy the code over and over with the appropriate tables to convert, is there a better way to do that? 3) Building on question 2, If there are no records I would like it to not clunk out because there are no records in the table to convert. I am pretty sure I need an if else or if then statement, but I am not proficient with python scripting. Any help would appreciated. #importing modules
import arcpy
import os
import csv
# set the workspace
arcpy.env.workspace = "F:/Home/GIS/Depts/GIS/proj/ServiceRequest/ServiceRequest.gdb"
arcpy.env.overwriteOutput = True
#setting variables
workspace = arcpy.env.workspace
fc = "/ServiceRequests"
fields = ["STATUS","REQUESTID"]
expression = arcpy.AddFieldDelimiters ("workspace", "STATUS") + " = 'Unassigned'"
print "Starting transport Captain"
#setting local variables and setting up Table to Table Conversion
inTable = "ServiceRequests"
outLocation = workspace
outTable = "Unassigned"
#Table to Table conversion
arcpy.TableToTable_conversion (inTable, outLocation, outTable, expression)
print "Table made it to destination Captain"
#updating records from unassigned to assigned
fcToUpdate = "F:/Home/GIS/Depts/GIS/proj/ServiceRequest/ServiceRequest.gdb/ServiceRequests"
affectedField = "STATUS"
oldValue = 'Unassigned'
newValue = 'Assigned'
queryString = '"' + affectedField + '" = ' + "'" + oldValue + "'"
with arcpy.da.UpdateCursor(fcToUpdate, (affectedField,), queryString) as cursor:
for row in cursor:
row[0] = newValue
cursor.updateRow(row)
# Converting FileGeoDatabase Table to .TXT for emailing
print "Starting conversion GIS to CSV Captain"
table = outTable
outfile = "F:/Home/GIS/Depts/GIS/proj/ServiceRequest/Unassigned.txt"
#--first lets make a list of all of the fields in the table
fields = arcpy.ListFields(table)
field_names = [field.name for field in fields]
with open(outfile,'wb') as f:
w = csv.writer(f)
#--write all field names to the output file
w.writerow(field_names)
#--now we make the search cursor that will iterate through the rows of the table
for row in arcpy.SearchCursor(table):
field_vals = [row.getValue(field.name) for field in fields]
w.writerow(field_vals)
del row
del table
del outTable
print "Mission Success Captain. Returning to Base"
... View more
06-18-2014
07:43 AM
|
0
|
5
|
4471
|
POST
|
Thanks Robert for the quick reply and answers to my questions. I will definitely look at the topology of the parcels and see if that solves the issue of non-selection. Thanks for the explanation on what each one does.
... View more
05-09-2014
04:48 AM
|
0
|
0
|
743
|
Title | Kudos | Posted |
---|---|---|
4 | 05-30-2023 02:04 PM | |
2 | 04-11-2022 02:07 PM | |
1 | 10-03-2022 02:28 PM | |
1 | 05-05-2021 12:25 PM | |
1 | 09-22-2017 01:45 PM |
Online Status |
Offline
|
Date Last Visited |
04-03-2024
11:21 AM
|