Menggunakan arcpy.SetParameter () dengan Python Script Tool diterbitkan sebagai Layanan Geoprocessing?

8

Saya memiliki skrip yang perlu dipublikasikan ke ArcGIS Server sebagai layanan geoprocessing. Script ini menghitung satu set catatan dalam bentuk tabel. Saya perlu mengatur parameter output sehingga mengembalikan tabel (recordset).

Jadi, untuk memastikan saya memiliki tabel (bukan kelas fitur), saya menggunakan arcpy.TableToTable_conversion (), mengeluarkan tabel ke ruang kerja in_memory. Jadi, saya tahu saya punya meja. Saya tahu bahwa ia memiliki catatan, karena saya dapat melakukan arcpy.GetCount dan dapatkan jumlah catatan.

Saya memiliki parameter output yang ditentukan. Begini tampilannya:

arcpy.SetParameter(2, theTable)

Apa pun yang saya coba ini tidak berhasil. Di kotak alat saya, parameter output ditetapkan sebagai RecordSet. Saya sudah mencoba memasok objek recordset, jalur ke kelas fitur dalam memori, dan banyak ide lainnya.

Bagaimana Anda menangani dengan benar mengeluarkan tabel ke output recordset menggunakan SetParameter untuk server ArcGIS?

Kenton W
sumber
Kedengarannya seperti (dari ESRI) bahwa saya tidak bisa menggunakan ruang kerja di-memori untuk menghasilkan set rekaman. Pada saat layanan pergi untuk mengambil item yang diatur dalam pernyataan SetParameter, tabel dalam memori telah dihapus.
Kenton W
1
Tidak yakin siapa yang memberitahumu itu, tapi itu tidak benar. Anda dapat menggunakan output in_mory. Satu-satunya waktu nyata Anda tidak dapat menggunakan output in_memory adalah ketika Anda ingin menggambar hasilnya dengan server peta hasil
KHibma

Jawaban:

5

Dalam pengalaman saya (dan saya lebih dari senang bisa diperbaiki pada ini) ketika Anda membangun layanan geoprocess argumen yang Anda berikan untuk output bukan objek itu sendiri, tetapi referensi ke objek (path file).

Tipe data hanya memberi tahu server cara menafsirkan data tergantung pada cara Anda menjalankan alat (dalam aplikasi itu mungkin secara otomatis menampilkan catatan-set, dari SOAP Anda mungkin mendapatkan catatan ditetapkan sebagai aliran data (meskipun saya tidak yakin ) dan melalui REST Anda hanya akan mendapatkan tautan).

Pada dasarnya Anda perlu menulis tabel Anda ke file ini - ArcGIS server akan secara otomatis menambahkan folder / jobid path ke depan berdasarkan folder output Anda dari saat Anda menambahkan model ke server. misalnya

  1. Folder output Anda di server mungkin C:/arcgisserver/arcgisoutput
  2. Jadi pada server folder ini menjadi /arcgisoutput
  3. Maka output Anda untuk kotak peralatan Anda mungkin /arcgisoutput/tabletoolbox
  4. Nilai Anda untuk output mungkin %scratchworkspace%/tablename.csv

Perhatikan bahwa %scratchworkspace%server ArcGIS memungkinkan untuk sub dalam direktori output. Lihat Konsep Kunci untuk Layanan Geoprosesing dalam bantuan ESRI.

Jadi server secara otomatis membuat id pekerjaan (UUID), membuat folder untuk Anda dalam output, dan menambahkan ini ke argumen output Anda. Tulis data Anda di sana dan ketika Anda mendapatkannya kembali dari server arcgis Anda akan mendapatkan tautan href seperti: http://server_name/arcgisoutput/tabletoolbox/job_id/tablename.csv

Anda sekarang dapat mengakses file urllib2.urlopen(path).read()sesuka Anda (gunakan Python sebagai pintasan cepat).

Semoga semua ini jelas! -H

om_henners
sumber
0

Saya berasumsi bahwa param recordset telah ditetapkan untuk diturunkan dalam skrip parameter.

Saya juga berasumsi bahwa Anda mungkin menerbitkan alat baik secara langsung dengan kotak alat atau melalui proyek mxd. Dalam pengalaman saya, saya lebih sukses dengan alat yang diterbitkan dalam proyek mxd.

Kadang-kadang saya telah menyelesaikan masalah layanan geoproses dengan menerbitkan model ModelBuilder yang hanya membungkus skrip python yaitu di dalam model saya hanya memiliki skrip dan saya mengekspos parram skrip di luar model.

Roberto Messora
sumber
Saya menggunakan kotak alat khusus untuk menerbitkan skrip sebagai layanan. Saat Anda mengatur parameter ke Output, parameter itu secara otomatis diubah ke Derived.
Kenton W