4

Every so often I have to update my city's FEMA data, which requires running the Dice (Data Management) geoprocessing tool on the buffered floodway features so that it can be more easily processed as a feature class.

I run into the following problem every time I do it which requires a work around: when dicing the entire feature class, the output drops large swathes of features seemingly at random:

Input:

Input Feature Class

Diced output:

Output of Dice tool

I am using a vertex limit of 500 when running Dice. Ive tried changing the vertex limit and this does not fix the problem, so i am forced to continue selecting the dropped portions and re running dice on them until the entire feature class is processed.

Anyone have experience with this issue or a possible alternate method?

I am running arcmap 10.3.1

  • 1
    Are you running 64bit background processing? This can fix some memory issues. – klewis May 12 '17 at 16:30
  • 2
    I had a similar issue in the past and think the problem is that the dice tools changes the geometry and during the revalidation/repairing stage, some geometries lose their integrity (convex/concave definitions or where is in/out of the polygon) and ArcMap demotes them into tiny polygons usually with negative area. The workaround helped me was to Generalize (in Editing toolset) the overall polygon feature class (of course this manipulates the original geometry leading to more generalized features) to a coarser resolution. – fatih_dur May 13 '17 at 17:01
  • It was for a very detailed tree canopy cover and remember using 0.50 meters as tolerance was a fair trade-off point where the shapes did not change too much whereas all analysis/data management tools worked much more smoothly. Here the trade-off is a critical term! You can try Generalize tool without giving any tolerance value, which means find excessive vertices and remove them, and retry Dice. – fatih_dur May 13 '17 at 17:05
  • I would first try the 64bit processing as suggested and if that did not work go for the selection approach. A simple model could easily batch this up and merge them all back. – Hornbydd May 13 '17 at 18:40
  • i know you are looking for an answer in ESRI software but if you can get this layer into postgis the st_subdivide function will get you what you want. – ziggy May 14 '17 at 3:02
1

This sounds like the issue that I wrote an ArcPy workaround for about 7 years ago for a site, not long after I started coding in ArcPy and Python (so the code was relatively straightforward).

The use case was mentioned at Script needed to create adaptive tiles from data density of feature class. That workaround was based on the adaptive tiling used by ArcStorm of the original ARC/INFO and involved:

  • specifying a threshold for the number of vertices to be left in each "tile"
  • clipping the data into two feature classes by using polygons that represent an "extent polygon split vertically"
  • counting the number of vertices left in each half to see if they then fell under the threshold
  • if they did then there is no need to clip them again
  • if not then clip again using a horizontally split polygon from one of the halves above
  • repeat until all output feature classes fall below the threshold and then append them all together

The output is like that below (from Tiled processing of large datasets) except that I split into two rather than four.

enter image description here

My understanding is that even after Dice was released this site continued to use the workaround.

I counted the vertices using Count Vertices which I wrote at the same time.

1

I was able to write a script that takes care of the operation without dropping portions by dicing and erasing then merging. I originally intended for it to be a toolbox but just use it as a stand alone script:

import arcpy

arcpy.env.overwriteOutput = True
SpatialReference = arcpy.SpatialReference(2278)
arcpy.env.outputCoordinateSystem = SpatialReference

Input = r"C:\Users\User\Desktop\FEMAnad83StatePlane.gdb\pwFEMA"
OutputLocation = r"C:\Users\User\Desktop\femaprep\femaprep.gdb"
arcpy.env.workspace = OutputLocation
output = "pwFEMA100Buffer"


arcpy.MakeFeatureLayer_management(Input, "pwFEMALayer",
                                  "FLD_ZONE = 'A' OR FLD_ZONE = 'AE' OR FLD_ZONE = 'AH' OR FLD_ZONE = 'AO' OR FLD_ZONE = 'X' AND ( ZONE_SUBTY = '1 PCT FUTURE CONDITIONS' OR ZONE_SUBTY = 'FLOODWAY' )")

arcpy.AddMessage("Executing Buffer....")
arcpy.Buffer_analysis(in_features="pwFEMALayer",
                      out_feature_class="{0}/pwFEMA_Buffer".format(OutputLocation),
                      buffer_distance_or_field="100 Feet", line_side="FULL", line_end_type="ROUND",
                      dissolve_option="ALL", method="PLANAR")
arcpy.AddMessage("Buffer successful")

arcpy.AddMessage("Dicing....")
arcpy.Dice_management("pwFEMA_Buffer", "{0}/pwFEMA_Buffer_Dice".format(OutputLocation), "500")
arcpy.AddMessage("Dice successful")

arcpy.AddMessage("Erasing....")
arcpy.Erase_analysis("pwFEMA_Buffer", "pwFEMA_Buffer_Dice", "{0}/pwFEMA_Buffer_Erase".format(OutputLocation))
arcpy.AddMessage("Erase successful")

arcpy.AddMessage("Dicing erase results....")
arcpy.Dice_management("pwFEMA_Buffer_Erase", "{0}/pwFEMA_Buffer_Erase_Dice".format(OutputLocation), "500")
arcpy.AddMessage("Second dice successful")

arcpy.AddMessage("Merging results to pwFEMA100Buffer....")
arcpy.Merge_management(["pwFEMA_Buffer_Dice", "pwFEMA_Buffer_Erase_Dice"], "{0}/{1}".format(OutputLocation, output))
arcpy.AddMessage("Merge successful")

arcpy.AddMessage("Repairing geometry....")
arcpy.RepairGeometry_management("pwFEMA100Buffer")
arcpy.AddMessage("Repair successful")

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.