Come specificare l'unità di misura quando si accede all'attributo 'lunghezza' dell'oggetto Geometry ()?


10

Utilizzando lo strumento CalculateField_management, è possibile specificare l'unità di misura quando si calcola la lunghezza della forma:

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

Vorrei fare la stessa cosa all'interno di un cursore usando 'SHAPE @ LENGTH' di ogni funzione, con la lunghezza restituita in un'unità di mia scelta:

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

O forse usando l'oggetto (meno efficiente) della geometria @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)

C'è un modo per farlo?

Risposte:


7

Per ora dovrai usare una soluzione alternativa, la lunghezza sarà sempre nell'unità lineare del riferimento spaziale della geometria. Conoscere il fattore di conversione per i piedi in metri e la metersPerUnitproprietà dovrebbe aiutarti nella maggior parte dei casi, oppure aggiungere un campo e usare la calcolatrice di campo shape.length@feetcome hai menzionato prima. Un'altra opzione sarebbe quella di specificare il riferimento spaziale del cursore come sistema di coordinate geografiche (come WGS84) e non come sistema di coordinate proiettato. Quindi i metodi Geometry.getLength()e geometry.getArea()restituiranno i numeri in metri, che puoi nuovamente convertire in piedi abbastanza facilmente.

Abbiamo appena aggiunto un secondo argomento opzionale a Geometry.getLength/getArea method in 10.2.1 per specificare le unità, quindi ogni volta che viene spedito e ogni volta che arriva a te dovresti avere un modo diretto per farlo, ma per ora dovresti usare un altro rimedio.


6

Con gli oggetti geometria, il metodo getLength () restituisce sempre una distanza in metri, come mostrato qui . Ciò potrebbe essere desiderabile se, ad esempio, ti stai convertendo in miglia o piedi. Sarebbe relativamente semplice convertire da metri a una qualsiasi delle altre distanze lineari.

Se vuoi la tua lunghezza in gradi decimali, questo diventa un po 'più complicato poiché l'ingresso deve essere in un sistema di coordinate geografiche (GCS). Potresti voler esaminare il passaggio di un oggetto SpatialReference al cursore, discusso qui .

Ad esempio, ho un file di forma polilinea in NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet, un sistema di coordinate proiettate (PCS).

Con questo codice, posso accedere alla lunghezza di ogni oggetto in gradi decimali:

spatref = arcpy.SpatialReference(4326) #EPSG code for WGS84
length = [row[0] for row in arcpy.da.SearchCursor("layer", "SHAPE@LENGTH", spatial_reference=spatref)]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.