(This is Part 2 of a week long series of posts on the current project I am working on, to develop a reasonable GIS data maintenance strategy for Asset Management data. Read Part 1 here.)
Yesterday, I gave a very brief overview of what it maintaining asset management data in GIS involves. Of course, the reality is much more complicated. Over the years that I have been involved with this process, my role has grown from simple data capture, to having full control of the data and the workflow needed to maintain it.
As the amount of work this year increased dramatically, I realised that I would need to document the process that I’ve had in my head. The workload would need to be shared with the Desktop GIS team. The first thing I did was to create a coherent folder structure for data storage. While we are transitioning the system, all of our data is still file-based. This already poses a challenge, as multiple people would need to access the data, and would most likely keep copies on their own devices to avoid data loss/slow access times on the network.
This is what I came up with:
and this is the script which creates that basic structure:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
folder_assetarea = r"C:\Assets\AreaA" # The main folder for Area A | |
year = "2015" # The year to create the structure for | |
folder_year = os.path.join(fld_mun, year) | |
folder_list = [["conversion", ["cad_gis", "ftr_shp", "kml_gdb", | |
"pdf_jpg", "shp_gdb", "tbl_xls", | |
"xls_tbl",] "jpg_gis", "gps_gis", | |
"gis_cad"], | |
["data", ["recd", "sent"]], | |
["jpg", ["georef", "maps"]], | |
["mxd", ["site_mapbooks"]], | |
["pdf"], | |
["report", ["csv", "doc", "txt", "xls"]], | |
["workspace"]] | |
for fld in folder_list: | |
if len(fld) > 1: | |
for i in range(len(fld[1])): | |
subfolder_assetarea =os.path.join(folder_year, fld[0],fld[1][i]) | |
if os.path.exists(subfolder_assetarea): | |
print("Folder {} exists".format(subfolder_assetarea)) | |
else: | |
os.makedirs(subfolder_assetarea) | |
print("Created {}".format(subfolder_assetarea)) | |
else: | |
subfolder_assetarea = os.path.join(folder_year, fld[0]) | |
if os.path.exists(subfolder_assetarea): | |
print("Folder {} exists".format(subfolder_assetarea)) | |
else: | |
os.mkdir(subfolder_assetarea) |
It is still my intention to optimise that script and integrate it into my Asset Management Python Toolbox, but I haven’t had the time do it yet. That structure may look like overkill, but it’s the way I keep my sanity, and allows me to build checks into this process. If at any point the data needs to be reverted, I can retrieve the previous version. For example, if we receive a CAD drawing, the workflow is as follows:
- Save the CAD file under data\recd\date_assetperson
- Make a copy of the CAD file under conversion\cad_gis\date
- Georeference the CAD file using the projection of the local municipality/study area
- Convert the CAD layers (normally only the polylines, sometimes the points) to feature classes in a file gdb in the same folder
- Project the converted feature classes to a file gdbworkspace\date
- Process the data further in that working gdb
- Final working data is pulled from all the working gdbs and sorted in current.gdb
- Final data for handover is pushed into Municipality.gdb
This process has already saved me time over the last few weeks, where I had to fall back on a previous version of a feature class taken from a CAD drawing due to changing requirements. This is also why I am designing this workflow in an agile way – the requirements are constantly changing, and the data is different for each municipality. I’ve had to add more folders/feature datasets since I drew this up a month ago, and I’m still ironing out the kinks in the communication with the rest of the team.
That brings me to the next aspect of this workflow: the OneNote Notebook. The Asset GIS Notebook contains an Overview section at the top level, which has the contact details of the GIS team members and Asset Management team members. It also contains a breakdown of the folder structure with detailed explanations, as well as links to relevant external documentation, such as the Prefixes spreadsheet (more about that in Part 3).
For each municipal/study area folder in the Assets folder, there is a corresponding section group in the Notebook. This section group contains a General section (technical information such as projection, major towns in the region, project costing details) as well as sections per year. The year section contains all the tasks for the current year, such as
- Convert data received
- Create mapbooks for site
- Generate report
etc. Some of the tasks will be quite specific, depending on the state of the data and the client requirements. There is also a Paper Trail subsection, for all email/Lync/phone correspondence with the asset team. Any answers to questions we have about the data are recorded in this section, not only to cover the GIS Team for audit purposes, but also in case a team member must pick up a task where I have left off.
Of course, it would be terrible to lose all of this hard work. In lieu of a better system, I have MacGyvered a backup system of sorts, where each day before I leave, I sync the network folder to my local OneDrive for Business folder using SyncToy, which then syncs to the cloud. It’s not ideal, but it’s better than what I had before (which was nothing. If that network drive failed…)
Although there are other team members helping with the data capture portion of the work, and who have contributed to the development of the workflow, I still retain responsibility for the process. After they have finalised their data capture, I check the data in the feature classes, assign new GIS IDs (another tool for the toolbox) and load the data into its final structure (also another tool for the toolbox).
Tomorrow in Part 3, I will talk about the kind of data we work with. It will probably be even longer than this post, and will hopefully shed some light on why designing this workflow has been challenging.