So I have a polyline shapefile showing the border of a city, however there are multiple gaps in the shapefile ranging from ~2m to well over 1km that are almost impossible to see when viewing the area even at a large scale. I am trying to generate a polygon using this outline in ArcGIS, however due to the breaks I cannot. Is there any way to at least identify which line segments are not joined? I attempted this solution in python with no luck.
-
1Have you tried integrate resources.arcgis.com/en/help/main/10.1/index.html#//… or snap resources.arcgis.com/en/help/main/10.1/index.html#//…? – Michael Stimson Jun 1 '15 at 23:34
You can easily identify polylines that are not connected to other polylines using the feature vertices to points tool with dangle option selected. This does require a higher license level, but as you do not state which version you have I will assume you have it.
The output will be a point dataset which you could scan manually to identify where the gaps are and then correct the problem manually.
-
Hmmm I tried this and Arc outputted an empty feature class, despite the fact that there are definitely breaks in the shapefile, any idea why? – purelyp93 Jun 2 '15 at 22:26
-
Is the data multi-part? Try running it through a multi-part-to-single-part tool first? – Hornbydd Jun 2 '15 at 22:49
-
Aha! After running the multipart to singlepart tool, I had to run the output through the "Unsplit Lines" tool, which merges all the polylines together. From there I ran the feature vertices to points tool which showed all the breaks in the file. – purelyp93 Jun 3 '15 at 18:09
Depending on how accurate the rest of your points need to be, you can simply set the XY Tolerance of the Feature To Polygon tool to 2 or 3 meters. This will fill in your gaps for you, but it will also create polygons whose vertices differ from the original input vertices by 2 to 3 meters.
-
FeatureToPolygon requires ArcInfo, so it may not be available for everyone. – nagytech Jun 2 '15 at 9:50
-
I forgot to mention that in addition to the ~2m breaks, there are other, larger breaks around 15-20m that will need to be re-digitized once the missing section is located, so the Feature to Polygon tool cannot be used in this case. – purelyp93 Jun 2 '15 at 22:27
Here's a script to add lines in breaks of lines. It creates dangle points, figures out their XY, checks for those that are within a certain distance of each other (the maxDist
variable), and draws a line between those that are. It creates a new output with the same name as your input, plus "_connected"
. A workspace geodatabase and workspace folder are used for intermediate outputs.
##Local variables
#Input feature class
inFC = r"C:\Users\e1b8\Desktop\ScriptOutputs\OutData.gdb\Sample_FC"
#Max Distance
maxDist = "2 Meters"
#Workspace GDB
workspaceGDB = r"C:\temp\Workspace.gdb"
#Workspace folder
workspace = r"C:\temp"
#-------------
from arcpy import *
import os
env.overwriteOutput = True
#List for cleanup
garbage = []
print "feature vertices to points"
#Feature vertices to points
pointFC = os.path.join (workspaceGDB, "points")
FeatureVerticesToPoints_management (inFC, pointFC, "DANGLE")
#Add point FC to garbage list
garbage += [pointFC]
print "determining XY coordiantes"
#Get XY coordinates by OID
Xdi = {}
Ydi = {}
cursor = da.SearchCursor (pointFC, ["OID@", "SHAPE@X", "SHAPE@Y"])
for row in cursor:
Xdi[row[0]] = row[1]
Ydi[row[0]] = row[2]
print "point distance analysis"
#Point distance analysis
outTable = os.path.join (workspace, "table.dbf")
PointDistance_analysis (pointFC, pointFC, outTable, maxDist)
#Add table to garbage list
garbage += [outTable]
#Get spatial reference of input feature class
SR = Describe (inFC).spatialReference
print "Creating empty line fc"
#Empty feature layer for new lines
addedLinesFc = os.path.join (workspaceGDB, "newLines")
CreateFeatureclass_management (workspaceGDB,
"newLines",
"POLYLINE",
inFC, spatial_reference = SR)
#Add new line fc to garbage
garbage += [addedLinesFc]
#list of combos
combos = []
#Iterate table
print "iterating lines"
cursor = da.SearchCursor (outTable, ["INPUT_FID", "NEAR_FID"])
for row in cursor:
combo = sorted([row[0], row[1]])
#skip points if already used to make a line
if combo in combos:
continue
combos += [combo]
print row[0], row[1]
del cursor
print "inserting new features"
#insertcursor new lines
cursor = da.InsertCursor (addedLinesFc, "SHAPE@")
#iterate combos
for combo in combos:
array = arcpy.Array ([arcpy.Point (Xdi[combo[0]], Ydi[combo[0]]),
arcpy.Point (Xdi[combo[1]], Ydi[combo[1]])])
polyline = arcpy.Polyline(array)
cursor.insertRow ([polyline])
del cursor
#Merge lines
print "Creating final output"
mergeFC = inFC + "_connected"
Merge_management ([inFC, addedLinesFc], mergeFC)
print "Created:", mergeFC
#Clean up
for trash in garbage:
Delete_management (trash)
Let me know if anything doesn't make sense!
-
Unfortunately, my shapefile does not seem to work with the "Feature Verticies to points" tool. Even when I run the tool on it's own, it generates an empty class. – purelyp93 Jun 3 '15 at 17:29
-
Can you import it into a file geodatabase? Also you can try the RepairGeometry too on it. – Emil Brundage Jun 3 '15 at 17:33
-
Yep, I imported it into a file geodatabase, and ran RepairGeomtry on it with no change. Just to check I ran Feature Vertices to Points again on the new geodatabase file and it still outputted and empty point class. Could it be that the original file is corrupted or something? – purelyp93 Jun 3 '15 at 17:52
A workflow is:
- Create a GDB.
- In the GDB make a Feature Dataset.
- place your line file in the Feature Dataset
- Create a topology in the Feature Dataset
- Add the dangle rule to the topology
- drag topology into ArcMap
- Open Topology toolbar
- use topology error inspector to fix errors
- run
Feature to Polygon
tool.