Comment spécifier l'unité de mesure lors de l'accès à l'attribut 'longueur' de l'objet Geometry ()?

10

En utilisant l'outil CalculateField_management, on peut spécifier l'unité de mesure lors du calcul de la longueur de la forme:

#Calculate polyline lengths in miles
polylines = "C:\sampleShape.shp"
arcpy.CalculateField_management(polylines, "shapeLen", "!Shape.length@MILES!", "PYTHON_9.3")

Je voudrais faire la même chose dans un curseur en utilisant le 'SHAPE @ LENGTH' de chaque fonctionnalité, avec la longueur retournée dans une unité de mon choix:

#hypothetical example 1
with arcpy.da.UpdateCursor(polylines, field_names=["[email protected]", "shapeLen"]) as upCurs:
    for row in upCurs:
        row[1] = row[0]
        upCurs.updateRow(row)

Ou peut-être en utilisant l'objet (moins efficace) de géométrie @SHAPE?:

#hypothetical example 2
with arcpy.da.UpdateCursor(polylines, field_names=["@SHAPE", "shapeLen"]) as upCurs:
    for row in upCurs:
        row[1] = row[0].length@FEET
        upCurs.updateRow(row)

Y a-t-il un moyen de le faire?

Axel Esteban
la source

Réponses:

7

Pour l'instant, vous devrez utiliser une solution de contournement, la longueur sera toujours dans l'unité linéaire de la référence spatiale de la géométrie. Connaître le facteur de conversion des pieds en mètres et la metersPerUnitpropriété devrait vous aider la plupart du temps, ou ajouter un champ et utiliser la calculatrice de champ shape.length@feetcomme vous le mentionnez auparavant. Une autre option serait de spécifier la référence spatiale du curseur comme un système de coordonnées géographiques (tel que WGS84) et non comme un système de coordonnées projeté. Ensuite, les méthodes Geometry.getLength()et geometry.getArea()renverront des nombres en mètres, que vous pourrez à nouveau convertir en pieds assez facilement.

Nous venons d'ajouter un deuxième argument facultatif aux méthodes Geometry.getLength/getArea à 10.2.1 pour spécifier les unités, donc chaque fois qu'il est expédié et chaque fois qu'il vous parvient, vous devriez avoir un moyen direct de le faire, mais pour l'instant, vous devez utiliser une autre solution de contournement.

Jason Scheirer
la source
6

Avec les objets de géométrie, la méthode getLength () renvoie toujours une distance en mètres, comme on le voit ici . Cela peut être souhaitable si vous convertissez uniquement en miles ou en pieds, par exemple. Il serait relativement simple de convertir des mètres en n'importe quelle autre distance linéaire.

Si vous voulez votre longueur en degrés décimaux, cela devient un peu plus compliqué car l'entrée doit être dans un système de coordonnées géographiques (GCS). Vous voudrez peut-être étudier la possibilité de passer un objet SpatialReference à votre curseur, décrit ici .

Par exemple, j'ai un fichier de formes polyligne dans NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet, un système de coordonnées projetées (PCS).

Avec ce code, je peux accéder à la longueur de chaque objet en degrés décimaux:

spatref = arcpy.SpatialReference(4326) #EPSG code for WGS84
length = [row[0] for row in arcpy.da.SearchCursor("layer", "SHAPE@LENGTH", spatial_reference=spatref)]
Paul
la source