2017-03-10 3 views
-1

Je suis assez nouveau dans le monde des pythons, ceci étant mon premier script que j'ai écrit moi-même, mais je cherche de l'aide. En plus du script qui a besoin d'être nettoyé, j'ai des problèmes avec un outil de géotraitement utilisant arcpy. Je voudrais créer des tessellations basées sur des groupes de données ponctuelles, et éventuellement dans la tessellation, avoir moins de 50 points. J'ai créé un script, qui fonctionne, cependant, j'essaie d'automatiser l'unité de surface pour l'outil de tessellation de génération et il semble que je raccroche. Je finis par tuer le script.Tessellation python

Mise à jour pour ajouter un nouveau code:

Ainsi, le nouveau code est censé créer un tessellation hexagonale, se joindre à fichier VCN et pour rejoindre compte> 50 créer pavages hexagonaux de forage jusqu'à 50 pnts par hexagone. Ceci est ma première tentative de fonctions python et de sauter dans les pieds d'abord. La première erreur majeure est une plage de domaine invalide, mais j'ai des problèmes quant à ce que cela signifie exactement et appelle. Je connais son avec la dernière ligne du code je crois.

import arcpy as ap 
import os 

ap.env.overwriteOutput = True 
ap.env.workspace = "D:\\Ed_Stuff\Testing\All_Test_Workspace.gdb" 
out_gdb = "D:\\Ed_Stuff\Testing\All_Test_Out.gdb" 
pnts = "D:\Ed_Stuff\Hexagon.gdb\hexagon_subset" 
out_fc = "D:\\Ed_Stuff\Testing\All_Test_Workspace\Total_Tess.shp" 

def create_hex(pnts, out_fc, level=0, area=2560608986): 
    #pull extent from initial point feature 
    desc = ap.Describe(pnts) 
    Ext = desc.extent 
    SR = desc.SpatialReference 
    #generate hexagon for initial extent 
    out_fc = os.path.join(out_gdb,'hex_level_{0}'.format(level)) 
    ap.GenerateTessellation_management(out_fc, Ext, "Hexagon", area, SR) 
    print "Worked Check 1" 
    #spatially join with point layer 
    ap.MakeFeatureLayer_management(pnts, 'pnts_lyr') 
    fc_join = os.path.join(out_gdb, 'join_level_{0}'.format(level)) 
    ap.SpatialJoin_analysis(out_fc, 'pnts_lyr', fc_join, "JOIN_ONE_TO_ONE", "KEEP_ALL", "INTERSECT") 
    print "Worked Check 2" 
    ##ap.MakeFeatureLayer_management(fc_join, "fc_join_lyr", "'Join_Count'<50") 
    ##ap.SelectLayerByAttribute_management (in_layer_or_view, {selection_type}, {where_clause}, {invert_where_clause}) 
    #make layer of all hexes with 'Join_Count' < 50 and append to output tess file 
    ap.MakeFeatureLayer_management(fc_join, "fc_join_lyr", "'Join_Count'<50") 
    ap.Append_management(fc_join_lyr, out_fc) 
    print "Apended Again"+fc_join 
    field = arcpy.ListFields(fc_join, "Join_Count") 
    for field in fc_join: 
     if 'Join_Count' > 50 and level < 32: 
      ap.Dissolve_management(fc_join, dis_hex, ['OID'], '', "MULTI_PART", '') 
      hex_multi = os.path.join(out_gdb, 'multihex_level_{0}'.format(level)) 
      ap.MultipartToSinglepart_management (dis_hex, hex_multi) 
      print "Working... Maybe" 
      with arcpy.da.SearchCursor(hex_multi, field('OID')) as cursor: 
       for field in cursor: 
        hex = "in_memory/hex_{0}_{1}".format(level, 'OID') 
        desc = ap.Describt(hex) 
        Ext = desc.extent 
        create_hex(hex, out_fc, level+1, area*(1/3)) 
        print "Boots and Pants" 
        ap.Delete_management(hex) 

     elif level >= 32: 
      ap.Append_management(fc_join_lyr, out_fc) 
      print "Done at 32!" 

create_hex(pnts, out_fc) 

Ceci est mon erreur: Traceback (appel le plus récent en dernier): Fichier "D: /Ed_Stuff/Testing/Def_Tess_Test.py", ligne 50, en create_hex (VCN, out_fc) Fichier « D : /Ed_Stuff/Testing/Def_Tess_Test.py ", ligne 17, dans create_hex ap.GenerateTessellation_management (out_fc, Ext," Hexagone ", zone, SR) Fichier" C: \ Program Files (x86) \ ArcGIS \ Desktop10.4 \ ArcPy \ arcpy \ management.py ", ligne 15539, dans GenerateTessellation raise e ExecuteError: ERREUR 000375: Domaine de plage non valide. Echec de l'exécution (GenerateTessellation).

+0

Combien de temps faut-il courir avant d'avoir besoin de le tuer? Combien de temps la même opération prend-elle lorsqu'elle est exécutée depuis ArcMap? – Erica

+0

Salut Erica, ça a duré 12 heures et plus avant de finalement le tuer. Je l'ai laissé aller si longtemps parce que c'est un ensemble de données plutôt grand. –

+0

J'essaie de comprendre comment mettre à jour mon code ici, on m'a dit d'écrire le script dans un format de fonction. J'ai un nouveau code et maintenant de nouvelles erreurs. –

Répondre

0

Cette erreur indique clairement que GenerateTesselation est l'endroit où il échoue. Je devine la cause, cependant. Solutions possibles ...

  1. Modifier le Shape_Type à « HEXAGONE » au lieu de « Hexagone »
  2. Plus probablement, l'unité zonale (paramètre Size) doit avoir des unités spécifiées avec elle. À l'heure actuelle, area est défini comme un entier et semble avoir besoin d'être une chaîne à la place, avec des unités spécifiées (par exemple, "5000 SquareMiles").

    Le code exemple du GenerateTesselation help page peut être utile:

    # Find the width, height and linear unit used by the input feature class' extent 
    # Divide the width and height value by three 
    # Multiply the divided values together and specify an area unit from the linear unit 
    # Should result in a 4x4 grid covering the extent. (Not 3x3 since the squares hang over the extent.) 
    w = extent.width 
    h = extent.height 
    u = extent.spatialReference.linearUnitName 
    area = "{size} Square{unit}s".format(size=w/3 * h/3, unit=u)