أكثر

هل من الممكن توسيط المضلعات الموجودة على طبقة نقطية؟

هل من الممكن توسيط المضلعات الموجودة على طبقة نقطية؟


أنا أكتب برنامج نصي بيثون يقوم بأتمتة خرائط الشبكة الخاصة بنا. كل شيء يعمل بشكل جيد بخلاف الشبكات التي يتم وضعها بشكل غير ملائم في بعض الأحيان.

لقد كنت أستخدم ميزة إنشاء فهرس الشبكة ، والتي تضع orgin في أسفل يسار مدى الطبقات. هذا جيد لمجموعات البيانات الكبيرة لأنه يعكس عادةً أفضل ملاءمة. لديّ الكود أيضًا عند الحاجة إلى شبكة واحدة فقط (مركز على طبقة النقاط ، اجعل المدى مساويًا لإطار البيانات بمقياس 9000 ، ثم احصل على xmin و ymin من إطار البيانات). المشكلة هي مجموعات النقاط الأصغر إلى المتوسطة الحجم.

أشعر بالفضول إذا كانت هناك طريقة لمحاذاة شبكة لتناسب طبقة النقاط بشكل أفضل. حاليًا ، يمكن أن يبدأ خط من النقاط في الزاوية اليسرى السفلية للشبكة ويمر عبر ورقة واحدة من خريطة الشبكة الخاصة بي وله نقطة واحدة في الصفحة الثانية. أرغب في محاذاة الشبكة حول النقاط بحيث يتم توزيع النقاط بالتساوي.

هل هذا شيء ممكن ضمن حدود ArcPy؟

النهج المستخدم

باستخدام إجابة ريتشارد فيرهورست ، أدركت أنني كنت أفكر في هذا الخطأ. باستخدام مثاله ، قررت الحصول على الإحداثيات المركزية لشبكتي وطبقة النقاط ، ثم أخذت الفرق بين النقطتين الوسطى واستخدمت هذه القيمة لتحويل جميع الميزات في الطبقة المذكورة. لقد تأثرت واستخدمت الوظيفة التالية للقيام بذلك ؛ الذي وجدته في ArcPy Café.

def shift_features (in_features، x_shift = None، y_shift = None): "" "ينقل الميزات بقيمة x و / أو y. تكون قيم الإزاحة في وحدات نظام إحداثيات in_features. المعلمات: in_features: string فئة ميزة موجودة أو طبقة المعالم. في حالة استخدام طبقة معالم مع تحديد ، سيتم تعديل المعالم المحددة فقط. x_shift: float المسافة التي سيتم إزاحة إحداثيات x بها. y_shift: float المسافة التي سيتم إزاحة إحداثيات y بها. "" "مع arcpy .da.UpdateCursor (in_features، ['SHAPE @ XY']) كمؤشر: للصف في المؤشر: cursor.updateRow ([[row [0] [0] + (x_shift or 0)، row [0] [1] + (y_shift or 0)]]) يعود

هذا هو الكود الذي توصلت إليه ، استنادًا إلى الكود المنشور بواسطة Curtis Price في المنشور 13 من هذا الموضوع: https://geonet.esri.com/thread/48226 يقرأ الكود حقل مخطط الطابق الخاص بالنقطة للعثور على الطابق المقابل مضلع المخطط في فئة معالم رئيسية ، ثم يقوم بتكرار المضلع إلى فئة معالم جديدة ، وينقل المضلع إلى المركز على النقطة ، ويقوم بتدوير المضلع بناءً على حقل زاوية الدوران في النقطة.

سوف تحتاج إلى تعديل المسارات وأسماء فئات المعالم في القسم الرئيسي من التعليمات البرمجية وتعديل sourceFieldList وقائمة الحقول في نص الكود لتلائم أسماء السمات الخاصة بك. قد لا يلائم هذا احتياجاتك ، لكنه يوضح أنه من الممكن استخدام النقاط للتحكم في موقع المضلعات ويجب أن يحتوي على عدة طرق مناسبة للتطبيقات الأخرى التي تحتاج إلى معالجة المضلعات.

# الاسم: PolyToPtMoveRotate.py # الغرض: تحريك النقطه الوسطى لميزة المضلع إلى النقطة # وتدوير المضلع بناءً على الاختلاف # بين حقل دوران المضلع # وحقل دوران النقطة # المؤلف: Richard Fraihurst، [email protected] # Created: 07/25/2015 09:44:25 ص # البيئة: ArcGIS 10.1+ # الائتمان: التدوير على أساس RotateFC.py بواسطة Curtis السعر # الموجود في المشاركة 13 في هذا الموضوع: # https://geonet.esri.com/thread / 48226 # ----------------------------------------------- -------------------- استيراد نظام التشغيل استيراد sys استيراد تتبع ارتداد arcpy من arcpy import env def MoveRotatePolygonToPoint (inputPolygonLyr ، inputPointLyr ، outputFC): "" "Move and Rotate Polygon To مدخلات النقطة PolygonFC ميزات مضلع الإدخال المدخلات ميزات نقطة الإدخال FC فئة ميزة الإخراج FC نظرًا لأن فئة ميزة الإخراج لم تعد تحتوي على مواقع xy "حقيقية" ، بعد التدوير ، لم يتم تحديد نظام إحداثي. "" def RotateXY (x، y، xc = 0 ، yc = 0، angle = 0، الوحدات = "DEGREES"): "" "قم بتدوير xy cooordinate ab من أصل محدد ، إحداثيات x ، y xy ، xc ، مركز yc لوحدات زاوية الدوران "DEGREES" (افتراضي) أو "RADIANS" "" استيراد الرياضيات x = x - xc y = y - yc # صنع الزاوية في اتجاه عقارب الساعة (مثل Rotate_management ) #angle = زاوية * -1 إذا كانت الوحدات == "DEGREES": زاوية = math.radians (زاوية) xr = (x * math.cos (زاوية)) - (y * math.sin (زاوية)) + xc yr = (x * math.sin (زاوية)) + (y * math.cos (زاوية)) + yc return xr، yr print ("طريقة البدء") # أسماء temp للتنظيف env_file = لا شيء lyrFC، lyrTmp، lyrOut = [ لا شيء] * 3 # طبقات tmpFC = لا شيء # صف مجموعة بيانات temp ، صفوف ، oRow ، oRows = [None] * 4 # cursors print ("Temp variables set up") حاول: # تحقق من أن الإدخال صحيح أنواع الأشكال dPoly = arcpy. وصف ( inputPolygonLyr) polyShpType = dPoly.shapeType if polyShpType! = 'Polygon': زيادة استثناء ، "لا يمكن أن يكون نوع الشكل {0} لـ inputPolygonLyr" .format (polyShpType) dPoint = arcpy.Describe (inputPointLyr) ptShpType = ptShpType = ptShpType = = 'Point': lift Exception، "لا يمكن أن يكون نوع الشكل {0} لـ inputPointLyr" .form في (ptShpType) FID = dPoint.OIDFieldName إذا كان arcpy.Exists (outputFC): طباعة arcpy.Delete_management (outputFC) ("Deleted outputFC") # إعداد بيئة env_file = arcpy.CreateScratchName ("xxenv"، ". xml"، " file. مساحة العمل إذا لم يكن WKS: إذا كان os.path.dirname (إخراج FC): WKS = os.path.dirname (إخراج FC) else: WKS = os.path.dirname (arcpy.Describe (inputPolygonFC) .catalogPath) env.workspace = env .scratchWorkspace = طباعة WKS ("إعداد ورقة عمل الصفر") # إنشاء فئة ميزة مؤقتة tmpFC = arcpy.CreateScratchName ("xxfc"، ""، "featureclass") arcpy.CreateFeatureclass_management (os.path.dirname (tmpFC)، os. path.basename (tmpFC)، polyShpType) lyrTmp = "lyrTmp" arcpy.MakeFeatureLayer_management (tmpFC، lyrTmp) # إعداد حقل معرف (يُستخدم للانضمام لاحقًا) TFID = "XXXX_FID" arcpy.AddField_management (lyrTmp، TFID) أركب y.DeleteField_management (lyrTmp، "ID") print ("Created temp layer") sourceFieldsList = ['FLOORPLAN'، 'SHAPE @'، 'BUILDING_X_COORDINATE'، 'BUILDING_Y_COORDINATE'، 'ROTATION'] # استخدم قائمة الفهم لإنشاء قاموس من قيمة da SearchCursor valueDict = {r [0] :( r [1:]) لـ r في arcpy.da.SearchCursor (inputPolygonLyr، sourceFieldsList)} طباعة ("قراءة قاموس قالب المضلع") fieldList = ['SHAPE @'، 'OID @'، 'FLOORPLAN'، 'BUILDING_X_COORDINATE'، 'BUILDING_Y_COORDINATE'، 'ROTATION'] # مؤشرات القراءة والكتابة المفتوحة Rows = arcpy.da.SearchCursor (inputPointLyr، fieldList) print ("مؤشر البحث المفتوح على النقاط") insertFieldsList = ['SHAPE @'، TFID] oRows = arcpy.da.InsertCursor (lyrTmp، insertFieldsList) طباعة أجزاء = arcpy.Array () rings = arcpy.Array () ring = arcpy.Array () cnt = 0 print ("البدء في إنشاء المضلعات المنقولة والمدارة") للصف في الصفوف: #print (str (Row)) floorplan = str (Row [2]) إذا كان مخطط الأرضية في valueDict: #print ("Found { } في القاموس ". format (floorplan)) sh p = valueDict [floorplan] [0] #print (str (shp)) xCen = float (Row [3]) #print (str (xCen)) xOffset = xCen - float (valueDict [floorplan] [1]) #print (str (xOffset)) yCen = float (Row [4]) #print (str (yCen)) yOffset = yCen - float (valueDict [floorplan] [2]) #print (str (yOffset)) angle = float (Row [5]) - float (valueDict [floorplan] [3]) ## if angle <0: ## angle = angle - 180 #print (str (angle)) #print ("Read Fields") p = 0 للجزء في shp: لـ pnt جزئيًا: إذا كان pnt: xMoved = pnt.X + xOffset yMoved = pnt.Y + yOffset x، y = RotateXY (xMoved، yMoved، xCen، yCen، angle) ring.add (arcpy.Point (x ، y، pnt.ID)) else: # إذا كان لدينا خاتم ، احفظه إذا كان len (ring)> 0: rings.add (ring) ring.removeAll () # لدينا آخر حلقة ، أضفها حلقات. (ring) ring.removeAll () # إذا كان واحدًا فقط ، قم بإزالة التعشيش إذا كان len (الحلقات) == 1: rings = rings.getObject (0) parts.add (rings) rings.removeAll () p + = 1 # إذا كان فقط أولاً ، قم بإزالة التداخل إذا كان len (parts) == 1: parts = parts.getObject (0) إذا كان dPoly.shapeType == "Polyline": shp = arcpy.Polyline (أجزاء) else: shp = arcpy.Polygon (parts) parts.removeAll () #print ("حصلت على شكل جديد") oRow = [shp، Row [1]] oRows.insertRow (oRow) cnt + = 1 del oRow، oRows # close write index ( تأكد من كتابة المخزن المؤقت) oRow، oRows = None، None # متغيرات الاستعادة لتنظيف الطباعة ("Created {0} polygons" .format (cnt)) # Join attributes ، and copy to output arcpy.AddJoin_management (lyrTmp، TFID، inputPointLyr، FID ) print ("added Join") env.qualifiedFieldNames = False arcpy.Merge_management (lyrTmp، outputFC) print ("Merged") lyrOut = "lyrOut" arcpy.MakeFeatureLayer_management (outputFC، lyrOut) # drop temp field 2،3 (TFID، FID) fnames = [f.name for f in arcpy.ListFields (lyrOut)] dropList = "؛". Join (fnames [2: 4]) arcpy.DeleteField_management (lyrOut، dropList) print ("Join Attributes") ## باستثناء MsgError، xmsg: ## arcpy.AddError (str (xmsg)) باستثناء arcpy.ExecuteError: tbinfo = traceback.format_tb (sys.exc_info () [2]) [0] arcpy.AddError (tbinfo.strip ()) arcpy .AddError (arcpy.GetMessages ()) numMsg ​​= arcpy.GetMessageCount () لـ i في النطاق (0 ، n umMsg): arcpy.AddReturnMessage (i) باستثناء استثناء ، xmsg: tbinfo = traceback.format_tb (sys.exc_info () [2]) [0] arcpy.AddError (tbinfo + str (xmsg)) أخيرًا: # إعادة تعيين البيئة إذا env_file : arcpy.LoadSettings (env_file) # تنظيف الملفات المؤقتة لـ f في [lyrFC، lyrTmp، lyrOut، tmpFC، env_file]: جرب: if f: arcpy.Delete_management (f) باستثناء: pass # delete cursors try: for c in [ Row ، Rows ، oRow ، oRows]: del c باستثناء: pass if __name__ == '__main__': inputPolygonFC = r "L:  rfairhur  Layers  Building Outlines  Building Outlines.gdb  Building_Outline_Templates" inputPolygonLyr = "inputPolygonLyr" MakeFeatureLayer_management (inputPolygonFC، inputPolygonLyr) arcpy.SelectLayerByAttribute_management (inputPolygonLyr، "NEW_SELECTION"، "GARAGE_SIDE>" ") inputPointFC = r" L:  rfairhur  Layers  Building Outlines  Building Outlines. MakeFeatureLayer_management (inputPointFC، inputPointLyr) arcpy.SelectLayerByAttribute_management (inputPointLyr، "NEW_SELECTIO N "،" GARAGE_SIDE> "") outputFC = r "L:  rfairhur  Layers  Building Outlines  Building Outlines.gdb  Building_Outline_Polygons_FC" MoveRotatePolygonToPoint (inputPolygonLyr ، inputPointLyr ، outputFC)

شاهد الفيديو: Reclassify u0026 Convert Raster to Shapefile Polygon u0026 Calculate Area Using ArcGIS