Suite

Utilisation de arcpy.MakeFeatureLayer_management sur Shapefile et Feature Class

Utilisation de arcpy.MakeFeatureLayer_management sur Shapefile et Feature Class


L'objectif plus important avec ce code est de créer un polygone temporaire basé sur les coordonnées calculées (ce qu'il fait), puis de voir si le polygone croise le "unobscured_FC". Après avoir exécuté la sélection par emplacement, le polygone sera supprimé et toutes sortes d'autres hilarités s'ensuivront. J'ai seulement besoin du polygone temporaire pour le select.

Maintenant, j'ai lu que vous ne pouvez pas exécuter arcpy.SelectLayerByLocation_management() sur des fichiers de formes ou des classes d'entités, c'est pourquoi j'ai essayé de créer des couches d'entités à partir des deux. Cependant, malgré cela, j'obtiens cette erreur:

ExecuteError : échec de l'exécution. Les paramètres ne sont pas valides.
La valeur ne peut pas être une classe d'entités
ERREUR 000840 : la valeur n'est pas une couche raster.
ERREUR 000840 : La valeur n'est pas une couche de mosaïque.
Échec de l'exécution (SelectLayerByAttribute).

J'ai bien cherché une réponse à ce problème, et ils semblent tous me dire que je dois faire exactement ce que je fais déjà.

Comment est-ce que je n'arrive pas à transformer ces deux éléments en couches d'entités ?

Code ci-dessous…

unobscured_FC = r"C:example.gdbexample_FC" arcpy.MakeFeatureLayer_management(unobscured_FC, "unobscured_lyr") #Ces coordonnées sont calculées ci-dessus dans un bloc de code que j'ai exclu… coordList = [[[Xmax,Ymax], [Xmin ,Ymax], [Xmin,Ymin], [Xmax,Ymin]]] point = arcpy.Point() array = arcpy.Array() featureList = [] pour l'entité dans coordList : pour coordPair dans l'entité : point.X = coordPair [0] point.Y = coordPair[1] array.add(point) array.add(array.getObject(0)) polygone = arcpy.Polygon(array) array.removeAll() featureList.append(polygon) tempShape = os .path.join(sys.path[0], "temp.shp") arcpy.CopyFeatures_management(featureList, tempShape) arcpy.MakeFeatureLayer_management(tempShape, "tempShape_lyr") arcpy.SelectLayerByLocation_management("unobscured_lyr", "INTERSECT", "tempShape_lyr ", "", "NOUVELLE_SELECTION")

Le problème est que CopyFeatures ne veut pas prendre une liste de polygones et en faire une classe d'entités, il force fonctionnent de cette façon, mais comme la référence spatiale n'est pas définie, les objets polygones sont incomplets. La documentation d'aide indique que l'entrée doit être soitCouche d'entités;Couche de catalogue d'images.

La lecture de l'écriture de nouvelles géométries dans la documentation d'aide d'Esri vous permettra de mieux comprendre, mais je pense que vous avez déjà vu cette page car vous créez très bien les géométries.

Voici comment je créerais normalement une géométrie à partir de points connus :

SR = arcpy.SpatialReference(28356) # cet exemple est le changement MGA94 Zone 56 (Brisbane, Sydney, Newcastle) pour correspondre à vos données tempShape = os.path.join(sys.path[0], "temp.shp") # Créer une nouvelle classe d'entités vide arcpy.CreateFeatureclass_management(sys.path[0], "temp.shp","POLYGON",spatial_reference=SR) coordList = [[[Xmax,Ymax], [Xmin,Ymax], [Xmin,Ymin ], [Xmax,Ymin]]] point = arcpy.Point() array = arcpy.Array() avec arcpy.da.InsertCursor(tempShape,"[email protected]") comme ICur : pour la fonctionnalité dans coordList : pour coordPair dans la fonctionnalité : point.X = coordPair[0] point.Y = coordPair[1] array.add(point) array.add(array.getObject(0)) # c'est vrai, ajoute le premier au dernier # crée un polygone à partir du tableau polygon = arcpy.Polygon(array) polygon.spatial_reference = SR # définir la référence spatiale ICur.insertRow(polygon) # l'insérer dans la classe d'entités array.removeAll() # se préparer pour la suivante

Continuez ensuite votre code comme d'habitude pour sélectionner couche par emplacement.


Cela a fini par fonctionner et a renvoyé un compte de 1 - ce qu'il aurait dû avoir :

unobscured_FC = r"C:example.gdbexample_FC" arcpy.MakeFeatureLayer_management(unobscured_FC, "unobscured_lyr") SR = arcpy.Describe(unobscured_FC).spatialReference tempShape = os.path.join(sys.path[0], "temp .shp") arcpy.CreateFeatureclass_management(sys.path[0], "temp.shp","POLYGON",spatial_reference=SR) array = arcpy.Array() point = arcpy.Point() featureList = [] arcpy.env .overwriteOutput = True pour l'entité dans coordList : pour coordPair dans l'entité : point.X = coordPair[0] point.Y = coordPair[1] array.add(point) array.add(array.getObject(0)) polygone = arcpy .Polygon(array) array.removeAll() featureList.append(polygon) arcpy.CopyFeatures_management(featureList, tempShape) arcpy.MakeFeatureLayer_management(tempShape, "tempShape_lyr") arcpy.SelectLayerByLocation_management("unobscured_lyr", "INTERSECT", "tempShape, "tempShape_lyr") "", "NEW_SELECTION") polyCursor = arcpy.SearchCursor("unobscured_lyr") polyRow = polyCursor.next() count = 0 tandis que polyRow: count = count + 1 polyRow = polyCursor.next() print compter

Après avoir ajouté la référence spatiale, cela ne fonctionnait toujours pas. Mais une fois que j'ai ajouté la fonction d'écrasement, il l'a fait. Je ne sais pas pourquoi. j'aimerais bien une explication !


Voir la vidéo: GIS Python: Count shape files and Select by Location 2 Real world ArcPy examples