इस मामले में लड़ने के लिए तीन मुद्दे हैं:
- छेद
- बहुभुज के बीच की रेखाएँ
- अंतिम पंक्तियाँ
छेद
चूंकि छेद के भीतर कोई भी रेखा बनी रहेगी, इसलिए बहुभुजों से छेद हटा दें। नीचे की स्क्रिप्ट में मैं ऐसा श्राप देने वालों और ज्यामिति के इस्तेमाल से करता हूं।
बहुभुज के बीच की रेखाएँ
दो बहुभुजों को छूने वाली रेखाओं को हटाने की आवश्यकता होती है। नीचे दी गई स्क्रिप्ट में, मैं one to many
अपनी इनपुट सुविधा वर्ग के रूप में अपनी पंक्तियों के साथ और मेरे जुड़ने वाले फीचर वर्ग के रूप में मेरे बहुभुज के साथ एक स्थानिक जुड़ाव का प्रदर्शन करके ऐसा करता हूं। कोई भी रेखा जो दो बार उत्पन्न होती है, दो बहुभुजों को स्पर्श करती है और हटा दी जाती है।
अंतिम पंक्तियाँ
केवल एक छोर पर बहुभुज को छूने वाली रेखाओं को हटाने के लिए, मैं लाइनों को अंतिम बिंदुओं में परिवर्तित करता हूं। फिर मैं यह निर्धारित करने के लिए फीचर लेयर्स और सेलेक्शन का उपयोग करता हूं कि कौन से पॉइंट फ्लोटर्स हैं। मैं पॉलीगनों को प्रतिच्छेद करने वाले अंतिम बिंदुओं का चयन करता हूं। मैं तब अपना चयन बदल देता हूं। यह उन बिंदुओं का चयन करता है जो बहुभुज को नहीं काटते हैं। मैं किसी भी पंक्ति का चयन करता हूं जो इन चयनित बिंदुओं को काटती है और उन्हें हटा देती है।
परिणाम
मान्यताओं
- इनपुट फ़ाइल जियोडेटाबेस फीचर क्लासेस हैं
- ArcGIS उन्नत लाइसेंस उपलब्ध है (
erase
a और a के कारण feature vertices to points
)
- निरंतर, कनेक्टेड लाइनें एक एकल विशेषता है
- बहुभुज कोई ओवरलैप नहीं करते हैं
- मल्टीपार्ट पॉलीगन नहीं हैं
लिपि
नीचे दी गई स्क्रिप्ट आपकी लाइन फीचर क्लास प्लस के _GreedyClip
रूप में एक फीचर क्लास को आपके लाइन फीचर क्लास प्लस के नाम से आउटपुट करती है । एक कार्यक्षेत्र स्थान भी आवश्यक है।
#input polygon feature class
polyFc = r"C:\Users\e1b8\Desktop\E1B8\Workspace\Workspace.gdb\testPolygon2"
#input line feature class
lineFc = r"C:\Users\e1b8\Desktop\E1B8\Workspace\Workspace.gdb\testLine"
#workspace
workspace = r"in_memory"
print "importing"
import arcpy
import os
#generate a unique ArcGIS file name
def UniqueFileName(location = "in_memory", name = "file", extension = ""):
if extension:
outName = os.path.join (location, name + "." + extension)
else:
outName = os.path.join (location, name)
i = 0
while arcpy.Exists (outName):
i += 1
if extension:
outName = os.path.join (location, "{0}_{1}.{2}".format (name, i, extension))
else:
outName = os.path.join (location, "{0}_{1}".format (name, i))
return outName
#remove holes from polygons
def RemoveHoles (inFc, workspace):
outFc = UniqueFileName (workspace)
array = arcpy.Array ()
sr = arcpy.Describe (inFc).spatialReference
outPath, outName = os.path.split (outFc)
arcpy.CreateFeatureclass_management (outPath, outName, "POLYGON", spatial_reference = sr)
with arcpy.da.InsertCursor (outFc, "SHAPE@") as iCurs:
with arcpy.da.SearchCursor (inFc, "SHAPE@") as sCurs:
for geom, in sCurs:
try:
part = geom.getPart (0)
except:
continue
for pnt in part:
if not pnt:
break
array.add (pnt)
polygon = arcpy.Polygon (array)
array.removeAll ()
row = (polygon,)
iCurs.insertRow (row)
del iCurs
del sCurs
return outFc
#split line fc by polygon fc
def SplitLinesByPolygon (lineFc, polygonFc, workspace):
#clip
clipFc = UniqueFileName(workspace)
arcpy.Clip_analysis (lineFc, polygonFc, clipFc)
#erase
eraseFc = UniqueFileName(workspace)
arcpy.Erase_analysis (lineFc, polygonFc, eraseFc)
#merge
mergeFc = UniqueFileName(workspace)
arcpy.Merge_management ([clipFc, eraseFc], mergeFc)
#multipart to singlepart
outFc = UniqueFileName(workspace)
arcpy.MultipartToSinglepart_management (mergeFc, outFc)
#delete intermediate data
for trash in [clipFc, eraseFc, mergeFc]:
arcpy.Delete_management (trash)
return outFc
#remove lines between two polygons and end lines
def RemoveLines (inFc, polygonFc, workspace):
#check if "TARGET_FID" is in fields
flds = [f.name for f in arcpy.ListFields (inFc)]
if "TARGET_FID" in flds:
#delete "TARGET_FID" field
arcpy.DeleteField_management (inFc, "TARGET_FID")
#spatial join
sjFc = UniqueFileName(workspace)
arcpy.SpatialJoin_analysis (inFc, polygonFc, sjFc, "JOIN_ONE_TO_MANY")
#list of TARGET_FIDs
targetFids = [fid for fid, in arcpy.da.SearchCursor (sjFc, "TARGET_FID")]
#target FIDs with multiple occurances
deleteFids = [dFid for dFid in targetFids if targetFids.count (dFid) > 1]
if deleteFids:
#delete rows with update cursor
with arcpy.da.UpdateCursor (inFc, "OID@") as cursor:
for oid, in cursor:
if oid in deleteFids:
cursor.deleteRow ()
del cursor
#feature vertices to points
vertFc = UniqueFileName(workspace)
arcpy.FeatureVerticesToPoints_management (inFc, vertFc, "BOTH_ENDS")
#select points intersecting polygons
arcpy.MakeFeatureLayer_management (vertFc, "vertLyr")
arcpy.SelectLayerByLocation_management ("vertLyr", "", polygonFc, "1 FEET")
#switch selection
arcpy.SelectLayerByAttribute_management ("vertLyr", "SWITCH_SELECTION")
arcpy.MakeFeatureLayer_management (inFc, "lineLyr")
#check for selection
if arcpy.Describe ("vertLyr").FIDSet:
#select lines by selected points
arcpy.SelectLayerByLocation_management ("lineLyr", "", "vertLyr", "1 FEET")
#double check selection (should always have selection)
if arcpy.Describe ("lineLyr").FIDSet:
#delete selected rows
arcpy.DeleteFeatures_management ("lineLyr")
#delete intermediate data
for trash in [sjFc, "vertLyr", "lineLyr"]:
arcpy.Delete_management (trash)
#main script
def main (polyFc, lineFc, workspace):
#remove holes
print "removing holes"
holelessPolyFc = RemoveHoles (polyFc, workspace)
#split line at polygons
print "splitting lines at polygons"
splitFc = SplitLinesByPolygon (lineFc, holelessPolyFc, workspace)
#delete unwanted lines
print "removing unwanted lines"
RemoveLines (splitFc, polyFc, workspace)
#create output feature class
outFc = lineFc + "_GreedyClip"
outFcPath, outFcName = os.path.split (outFc)
outFc = UniqueFileName (outFcPath, outFcName)
arcpy.CopyFeatures_management (splitFc, outFc)
print "created:"
print outFc
print
print "cleaning up"
#delete intermediate data
for trash in [holelessPolyFc, splitFc]:
arcpy.Delete_management (trash)
print "done"
if __name__ == "__main__":
main (polyFc, lineFc, workspace)