এই ক্ষেত্রে তিনটি সমস্যা নিয়ে লড়াই করতে হবে:
- গর্ত
- বহুভুজ মধ্যে লাইন
- শেষ লাইন
গর্ত
যেহেতু কোনও গর্তের মধ্যে যে কোনও লাইন বজায় থাকবে, তাই বহুভুজগুলি থেকে গর্তগুলি সরিয়ে দিন। নীচের স্ক্রিপ্টে আমি কার্সার এবং জ্যামিতির ব্যবহার করে এটি করি।
বহুভুজ মধ্যে লাইন
দুটি বহুভুজের স্পর্শযুক্ত লাইনগুলি সরানো দরকার। নীচের স্ক্রিপ্টে আমি একটি one to many
ইনপুট বৈশিষ্ট্য শ্রেণি হিসাবে আমার লাইন এবং আমার যোগদান বৈশিষ্ট্য শ্রেণীর হিসাবে বহুভুজগুলি দিয়ে একটি স্থানিক যোগদানের মাধ্যমে এটি করি। যে দুটি লাইন দু'বার উত্পন্ন হয় দুটি বহুভুজকে স্পর্শ করে এবং সরানো হয়।
শেষ লাইন
কেবল এক প্রান্তে বহুভুজকে স্পর্শ করা লাইনগুলি সরাতে, আমি লাইনগুলি শেষ বিন্দুতে রূপান্তর করি। আমি এর পরে কোন শেষ পয়েন্টগুলি ফ্লাটার তা নির্ধারণ করতে বৈশিষ্ট্য স্তর এবং নির্বাচনগুলি ব্যবহার করি। বহুভুজকে ছেদ করে এমন শেষ পয়েন্টগুলি নির্বাচন করি। আমি তারপরে আমার নির্বাচনটি স্যুইচ করি। এটি শেষের পয়েন্টগুলি নির্বাচন করে যা বহুভুজকে ছেদ করে না। আমি এই নির্বাচিত পয়েন্টগুলিকে ছেদ করে যে কোনও লাইন নির্বাচন করি এবং সেগুলি মুছি।
ফলাফল
অনুমিতি
- ইনপুটগুলি ফাইল জিওডাটাবেস বৈশিষ্ট্য ক্লাস
- আর্কজিআইএস অ্যাডভান্সড লাইসেন্স উপলব্ধ (এক
erase
এবং এ কারণে 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)