Bagaimana menentukan unit pengukuran saat mengakses atribut 'panjang' objek Geometri ()?

10

Menggunakan alat CalculateField_management, seseorang dapat menentukan satuan pengukuran saat menghitung panjang bentuk:

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

Saya ingin melakukan hal yang sama di dalam kursor menggunakan 'SHAPE @ LENGTH' dari setiap fitur, dengan panjang yang dikembalikan dalam unit yang saya pilih:

#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)

Atau mungkin dengan menggunakan objek geometri @SHAPE (kurang efisien) ?:

#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)

Apakah ada cara untuk melakukan ini?

Axel Esteban
sumber

Jawaban:

7

Untuk saat ini Anda harus menggunakan solusi, panjangnya akan selalu dalam satuan linier dari referensi spasial geometri. Mengetahui faktor konversi untuk kaki ke meter dan metersPerUnitproperti harus membuat Anda mendapatkan yang terbaik, atau menambahkan bidang dan menggunakan kalkulator bidang shape.length@feetseperti yang Anda sebutkan sebelumnya. Pilihan lain adalah menentukan referensi spasial kursor sebagai sistem koordinat geografis (seperti WGS84) dan bukan sistem koordinat yang diproyeksikan. Kemudian Geometry.getLength()dan geometry.getArea()metode akan mengembalikan angka dalam meter, yang dapat Anda konversi kembali menjadi kaki dengan mudah.

Kami baru saja menambahkan argumen kedua opsional ke metode Geometry.getLength/getArea di 10.2.1 untuk menentukan unit, jadi setiap kali dikirimkan dan kapan pun Anda, Anda harus memiliki cara langsung untuk melakukannya, tetapi untuk sekarang Anda harus menggunakan solusi lain.

Jason Scheirer
sumber
6

Dengan objek geometri, metode getLength () selalu mengembalikan jarak dalam meter, seperti yang terlihat di sini . Misalnya, itu mungkin diinginkan jika Anda hanya mengonversi mil atau kaki. Akan relatif mudah untuk mengkonversi dari meter ke salah satu dari jarak linear lainnya.

Jika Anda ingin panjang Anda dalam derajat desimal, itu menjadi sedikit lebih rumit karena inputnya harus dalam Sistem Koordinat Geografis (GCS). Anda mungkin ingin melihat meneruskan objek SpatialReference ke kursor Anda, dibahas di sini .

Misalnya, saya memiliki polyline shapefile di NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet, sebuah Sistem Koordinat Proyeksi (PCS).

Dengan kode ini, saya dapat mengakses panjang setiap objek dalam derajat desimal:

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