

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menggunakan pekerjaan pemrosesan untuk beban kerja geospasial kustom
<a name="geospatial-custom-operations"></a>

Dengan [Amazon SageMaker Processing](processing-job.md), Anda dapat menggunakan pengalaman SageMaker AI yang disederhanakan dan dikelola untuk menjalankan beban kerja pemrosesan data dengan wadah geospasial yang dibuat khusus.

 Infrastruktur yang mendasari pekerjaan Amazon SageMaker Processing sepenuhnya dikelola oleh SageMaker AI. Selama pekerjaan pemrosesan, sumber daya klaster disediakan selama durasi pekerjaan Anda, dan dibersihkan saat pekerjaan selesai.

![\[Menjalankan pekerjaan pemrosesan.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/Processing-1.png)


Diagram sebelumnya menunjukkan bagaimana SageMaker AI memutar pekerjaan pemrosesan geospasial. SageMaker AI mengambil skrip beban kerja geospasial Anda, menyalin data geospasial Anda dari Amazon Simple Storage Service (Amazon S3), dan kemudian menarik wadah geospasial yang ditentukan. Infrastruktur yang mendasari untuk pekerjaan pemrosesan sepenuhnya dikelola oleh SageMaker AI. Sumber daya cluster disediakan selama durasi pekerjaan Anda, dan dibersihkan saat pekerjaan selesai. Output dari pekerjaan pemrosesan disimpan dalam ember yang Anda tentukan. 

**Kendala penamaan jalur**  
Jalur lokal di dalam wadah pekerjaan Pemrosesan harus dimulai dengan**/opt/ml/processing/**.

SageMaker geospasial menyediakan wadah yang dibuat khusus, `081189585635.dkr.ecr.us-west-2.amazonaws.com/sagemaker-geospatial-v1-0:latest` yang dapat ditentukan saat menjalankan pekerjaan pemrosesan.

**Topics**
+ [Ikhtisar: Jalankan pekerjaan pemrosesan menggunakan `ScriptProcessor` dan wadah SageMaker geospasial](geospatial-custom-operations-overview.md)
+ [Menggunakan `ScriptProcessor` untuk menghitung Normalized Difference Vegetation Index (NDVI) menggunakan data satelit Sentinel-2](geospatial-custom-operations-procedure.md)

# Ikhtisar: Jalankan pekerjaan pemrosesan menggunakan `ScriptProcessor` dan wadah SageMaker geospasial
<a name="geospatial-custom-operations-overview"></a>

SageMaker geospasial menyediakan wadah pemrosesan yang dibangun khusus,. `081189585635.dkr.ecr.us-west-2.amazonaws.com/sagemaker-geospatial-v1-0:latest` Anda dapat menggunakan wadah ini saat menjalankan pekerjaan dengan Amazon SageMaker Processing. Saat Anda membuat instance [https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ScriptProcessor](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ScriptProcessor)kelas yang tersedia melalui *Amazon SageMaker Python SDK for Processing*, tentukan ini. `image_uri`

**catatan**  
Jika Anda menerima ResourceLimitExceededkesalahan saat mencoba memulai pekerjaan pemrosesan, Anda perlu meminta peningkatan kuota. *Untuk memulai permintaan peningkatan kuota Service Quotas, lihat Meminta peningkatan [kuota pada Panduan Pengguna Service Quotas](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)* 

**Prasyarat untuk menggunakan `ScriptProcessor`**

1. Anda telah membuat Python skrip yang menentukan beban kerja MS geospasial Anda.

1. Anda telah memberikan akses peran eksekusi SageMaker AI ke bucket Amazon S3 apa pun yang diperlukan.

1. Siapkan data Anda untuk diimpor ke dalam wadah. Pekerjaan Amazon SageMaker Processing mendukung pengaturan `s3_data_type` sama dengan `"ManifestFile"` atau ke`"S3Prefix"`.

Prosedur berikut menunjukkan cara membuat instance `ScriptProcessor` dan mengirimkan pekerjaan Amazon SageMaker Processing menggunakan wadah SageMaker geospasial.

**Untuk membuat `ScriptProcessor` instance dan mengirimkan pekerjaan Amazon SageMaker Processing menggunakan wadah SageMaker geospasial**

1. Buat instance `ScriptProcessor` kelas menggunakan gambar SageMaker geospasial:

   ```
   from sagemaker.processing import ScriptProcessor, ProcessingInput, ProcessingOutput
   	
   sm_session = sagemaker.session.Session()
   execution_role_arn = sagemaker.get_execution_role()
   
   # purpose-built geospatial container
   image_uri = '081189585635.dkr.ecr.us-west-2.amazonaws.com/sagemaker-geospatial-v1-0:latest'
   
   script_processor = ScriptProcessor(
   	command=['python3'],
   	image_uri=image_uri,
   	role=execution_role_arn,
   	instance_count=4,
   	instance_type='ml.m5.4xlarge',
   	sagemaker_session=sm_session
   )
   ```

   Ganti *execution\$1role\$1arn* dengan ARN dari peran eksekusi SageMaker AI yang memiliki akses ke data input yang disimpan di Amazon S3 dan layanan AWS lain yang ingin Anda panggil dalam pekerjaan pemrosesan Anda. Anda dapat memperbarui `instance_count` dan `instance_type` untuk mencocokkan persyaratan pekerjaan pemrosesan Anda.

1. Untuk memulai pekerjaan pemrosesan, gunakan `.run()` metode ini:

   ```
   # Can be replaced with any S3 compliant string for the name of the folder.
   s3_folder = geospatial-data-analysis
   
   # Use .default_bucket() to get the name of the S3 bucket associated with your current SageMaker session
   s3_bucket = sm_session.default_bucket()
   					
   s3_manifest_uri = f's3://{s3_bucket}/{s3_folder}/manifest.json'
   s3_prefix_uri =  f's3://{s3_bucket}/{s3_folder}/image-prefix
   
   script_processor.run(
   	code='preprocessing.py',
   	inputs=[
   		ProcessingInput(
   			source=s3_manifest_uri | s3_prefix_uri ,
   			destination='/opt/ml/processing/input_data/',
   			s3_data_type= "ManifestFile" | "S3Prefix",
   			s3_data_distribution_type= "ShardedByS3Key" | "FullyReplicated"
   		)
   	],
   	outputs=[
           ProcessingOutput(
               source='/opt/ml/processing/output_data/',
               destination=s3_output_prefix_url
           )
       ]
   )
   ```
   + Ganti *preprocessing.py* dengan nama skrip pemrosesan data Python Anda sendiri.
   + Pekerjaan pemrosesan mendukung dua metode untuk memformat data input Anda. Anda dapat membuat file manifes yang menunjuk ke semua data input untuk pekerjaan pemrosesan Anda, atau Anda dapat menggunakan awalan umum pada setiap input data individual. Jika Anda membuat set file manifes `s3_manifest_uri` sama dengan`"ManifestFile"`. Jika Anda menggunakan awalan file yang disetel `s3_manifest_uri` sama dengan`"S3Prefix"`. Anda menentukan jalur ke data Anda menggunakan`source`.
   + Anda dapat mendistribusikan data pekerjaan pemrosesan Anda dengan dua cara:
     + Mendistribusikan data Anda ke semua instance pemrosesan dengan menyetel `s3_data_distribution_type` sama dengan`FullyReplicated`.
     + Mendistribusikan data Anda dalam pecahan berdasarkan kunci Amazon S3 dengan `s3_data_distribution_type` menyetel sama dengan. `ShardedByS3Key` Bila Anda menggunakan `ShardedByS3Key` satu pecahan data dikirim ke setiap instance pemrosesan.

    Anda dapat menggunakan skrip untuk memproses data SageMaker geospasial. Skrip itu dapat ditemukan di [Langkah 3: Menulis skrip yang dapat menghitung NDVI](geospatial-custom-operations-procedure.md#geospatial-custom-operations-script-mode). Untuk mempelajari lebih lanjut tentang operasi `.run()` API, lihat [https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ScriptProcessor.run](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ScriptProcessor.run)di *Amazon SageMaker Python SDK* for Processing.

Untuk memantau kemajuan pekerjaan pemrosesan Anda, `ProcessingJobs` kelas mendukung [https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ProcessingJob.describe](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ProcessingJob.describe)metode. Metode ini mengembalikan respons dari panggilan `DescribeProcessingJob` API. Untuk mempelajari lebih lanjut, lihat [`DescribeProcessingJob`di *Referensi Amazon SageMaker AI API*](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeProcessingJob.html).

Topik berikutnya menunjukkan cara membuat instance `ScriptProcessor` kelas menggunakan wadah SageMaker geospasial, dan kemudian bagaimana menggunakannya untuk menghitung Normalized Difference Vegetation Index (NDVI) dengan gambar. Sentinel-2



# Menggunakan `ScriptProcessor` untuk menghitung Normalized Difference Vegetation Index (NDVI) menggunakan data satelit Sentinel-2
<a name="geospatial-custom-operations-procedure"></a>

Contoh kode berikut menunjukkan kepada Anda cara menghitung indeks vegetasi perbedaan yang dinormalisasi dari area geografis tertentu menggunakan gambar geospasial yang dibuat khusus dalam notebook Studio Classic dan menjalankan beban kerja skala besar dengan Amazon Processing SageMaker menggunakan dari AI Python SDK. [https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ScriptProcessor](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ScriptProcessor) SageMaker 

Demo ini juga menggunakan instance notebook Amazon SageMaker Studio Classic yang menggunakan kernel geospasial dan jenis instans. Untuk mempelajari cara membuat instance notebook geospasial Studio Classic, lihat[Membuat notebook Amazon SageMaker Studio Classic menggunakan gambar geospasial](geospatial-launch-notebook.md).

Anda dapat mengikuti demo ini di instance notebook Anda sendiri dengan menyalin dan menempelkan cuplikan kode berikut:

1. [Gunakan `search_raster_data_collection` untuk menanyakan area minat tertentu (AOI) selama rentang waktu tertentu menggunakan pengumpulan data raster tertentu,. Sentinel-2](#geospatial-custom-operations-procedure-search)

1. [Buat file manifes yang menentukan data apa yang akan diproses selama pekerjaan pemrosesan.](#geospatial-custom-operations-procedure-manifest)

1. [Tulis skrip Python pemrosesan data yang menghitung NDVI.](#geospatial-custom-operations-script-mode)

1. [Buat `ScriptProcessor` instance dan mulai pekerjaan Amazon SageMaker Processing](#geospatial-custom-operations-create).

1. [Memvisualisasikan hasil pekerjaan pemrosesan Anda](#geospatial-custom-operations-visual).

## Kueri pengumpulan data Sentinel-2 raster menggunakan `SearchRasterDataCollection`
<a name="geospatial-custom-operations-procedure-search"></a>

Dengan `search_raster_data_collection` Anda dapat menanyakan koleksi data raster yang didukung. Contoh ini menggunakan data yang diambil dari Sentinel-2 satelit. Area minat (`AreaOfInterest`) yang ditentukan adalah pedesaan Iowa utara, dan rentang waktu (`TimeRangeFilter`) adalah 1 Januari 2022 hingga 30 Desember 2022. Untuk melihat koleksi data raster yang tersedia dalam Wilayah AWS penggunaan `list_raster_data_collections` Anda. Untuk melihat contoh kode menggunakan API ini, lihat [`ListRasterDataCollections`](geospatial-data-collections.md)di *Panduan Pengembang Amazon SageMaker AI*.

Dalam contoh kode berikut Anda menggunakan ARN yang terkait dengan pengumpulan data Sentinel-2 raster,. `arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/nmqj48dcu3g7ayw8`

Permintaan `search_raster_data_collection` API membutuhkan dua parameter:
+ Anda perlu menentukan `Arn` parameter yang sesuai dengan pengumpulan data raster yang ingin Anda kueri.
+ Anda juga perlu menentukan `RasterDataCollectionQuery` parameter, yang mengambil Python kamus.

Contoh kode berikut berisi pasangan kunci-nilai yang diperlukan untuk `RasterDataCollectionQuery` parameter yang disimpan ke variabel. `search_rdc_query`

```
search_rdc_query = {
    "AreaOfInterest": {
        "AreaOfInterestGeometry": {
            "PolygonGeometry": {
                "Coordinates": [[
                    [
              -94.50938680498298,
              43.22487436936203
            ],
            [
              -94.50938680498298,
              42.843474642037194
            ],
            [
              -93.86520004156142,
              42.843474642037194
            ],
            [
              -93.86520004156142,
              43.22487436936203
            ],
            [
              -94.50938680498298,
              43.22487436936203
            ]
               ]]
            }
        }
    },
    "TimeRangeFilter": {"StartTime": "2022-01-01T00:00:00Z", "EndTime": "2022-12-30T23:59:59Z"}
}
```

Untuk membuat `search_raster_data_collection` permintaan, Anda harus menentukan ARN dari pengumpulan data Sentinel-2 raster:. `arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/nmqj48dcu3g7ayw8` Anda juga harus meneruskan kamus Python yang telah ditentukan sebelumnya, yang menentukan parameter kueri. 

```
## Creates a SageMaker Geospatial client instance 
sm_geo_client= session.create_client(service_name="sagemaker-geospatial")

search_rdc_response1 = sm_geo_client.search_raster_data_collection(
    Arn='arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/nmqj48dcu3g7ayw8',
    RasterDataCollectionQuery=search_rdc_query
)
```

Hasil API ini tidak dapat dipaginasi. Untuk mengumpulkan semua gambar satelit yang dikembalikan oleh `search_raster_data_collection` operasi, Anda dapat menerapkan `while` loop. Ini memeriksa `NextToken` dalam respons API:

```
## Holds the list of API responses from search_raster_data_collection
items_list = []
while search_rdc_response1.get('NextToken') and search_rdc_response1['NextToken'] != None:
    items_list.extend(search_rdc_response1['Items'])
    
    search_rdc_response1 = sm_geo_client.search_raster_data_collection(
    	Arn='arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/nmqj48dcu3g7ayw8',
        RasterDataCollectionQuery=search_rdc_query, 
        NextToken=search_rdc_response1['NextToken']
    )
```

Respons API mengembalikan daftar URLs di bawah `Assets` kunci yang sesuai dengan pita gambar tertentu. Berikut ini adalah versi respons API yang terpotong. Beberapa pita gambar telah dihapus untuk kejelasan.

```
{
	'Assets': {
        'aot': {
            'Href': 'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/15/T/UH/2022/12/S2A_15TUH_20221230_0_L2A/AOT.tif'
        },
        'blue': {
            'Href': 'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/15/T/UH/2022/12/S2A_15TUH_20221230_0_L2A/B02.tif'
        },
        'swir22-jp2': {
            'Href': 's3://sentinel-s2-l2a/tiles/15/T/UH/2022/12/30/0/B12.jp2'
        },
        'visual-jp2': {
            'Href': 's3://sentinel-s2-l2a/tiles/15/T/UH/2022/12/30/0/TCI.jp2'
        },
        'wvp-jp2': {
            'Href': 's3://sentinel-s2-l2a/tiles/15/T/UH/2022/12/30/0/WVP.jp2'
        }
    },
    'DateTime': datetime.datetime(2022, 12, 30, 17, 21, 52, 469000, tzinfo = tzlocal()),
    'Geometry': {
        'Coordinates': [
            [
                [-95.46676936182894, 43.32623760511659],
                [-94.11293433656887, 43.347431265475954],
                [-94.09532154452742, 42.35884880571144],
                [-95.42776890002203, 42.3383710796791],
                [-95.46676936182894, 43.32623760511659]
            ]
        ],
        'Type': 'Polygon'
    },
    'Id': 'S2A_15TUH_20221230_0_L2A',
    'Properties': {
        'EoCloudCover': 62.384969,
        'Platform': 'sentinel-2a'
    }
}
```

Di [bagian berikutnya](#geospatial-custom-operations-procedure-manifest), Anda membuat file manifes menggunakan `'Id'` kunci dari respons API.

## Membuat file manifes masukan menggunakan `Id` kunci dari respons `search_raster_data_collection` API
<a name="geospatial-custom-operations-procedure-manifest"></a>

Saat menjalankan pekerjaan pemrosesan, Anda harus menentukan input data dari Amazon S3. Tipe data input dapat berupa file manifes, yang kemudian menunjuk ke file data individual. Anda juga dapat menambahkan awalan ke setiap file yang ingin diproses. Contoh kode berikut mendefinisikan folder tempat file manifes Anda akan dihasilkan.

Gunakan SDK for Python (Boto3) untuk mendapatkan bucket default dan ARN dari peran eksekusi yang terkait dengan instance notebook Studio Classic Anda:

```
sm_session = sagemaker.session.Session()
s3 = boto3.resource('s3')
# Gets the default excution role associated with the notebook
execution_role_arn = sagemaker.get_execution_role() 

# Gets the default bucket associated with the notebook
s3_bucket = sm_session.default_bucket() 

# Can be replaced with any name
s3_folder = "script-processor-input-manifest"
```

Selanjutnya, Anda membuat file manifes. Ini akan menyimpan gambar satelit yang ingin Anda proses ketika Anda menjalankan pekerjaan pemrosesan Anda nanti di langkah 4. URLs 

```
# Format of a manifest file
manifest_prefix = {}
manifest_prefix['prefix'] = 's3://' + s3_bucket + '/' + s3_folder + '/'
manifest = [manifest_prefix]

print(manifest)
```

Contoh kode berikut mengembalikan URI S3 tempat file manifes Anda akan dibuat.

```
[{'prefix': 's3://sagemaker-us-west-2-111122223333/script-processor-input-manifest/'}]
```

Semua elemen respons dari respons search\$1raster\$1data\$1collection tidak diperlukan untuk menjalankan pekerjaan pemrosesan. 

Cuplikan kode berikut menghapus elemen yang tidak perlu`'Properties'`,`'Geometry'`, dan. `'DateTime'` Pasangan `'Id'` kunci-nilai,`'Id': 'S2A_15TUH_20221230_0_L2A'`, berisi tahun dan bulan. Contoh kode berikut mem-parsing data tersebut untuk membuat kunci baru dalam Python **dict\$1month\$1items** kamus. Nilai adalah aset yang dikembalikan dari `SearchRasterDataCollection` kueri. 

```
# For each response get the month and year, and then remove the metadata not related to the satelite images.
dict_month_items = {}
for item in items_list:
    # Example ID being split: 'S2A_15TUH_20221230_0_L2A' 
    yyyymm = item['Id'].split("_")[2][:6]
    if yyyymm not in dict_month_items:
        dict_month_items[yyyymm] = []
    
    # Removes uneeded metadata elements for this demo 
    item.pop('Properties', None)
    item.pop('Geometry', None)
    item.pop('DateTime', None)

    # Appends the response from search_raster_data_collection to newly created key above
    dict_month_items[yyyymm].append(item)
```

Contoh kode ini  mengunggah `dict_month_items` ke Amazon S3 sebagai objek JSON menggunakan [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/upload_file.html](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/upload_file.html)operasi API:

```
## key_ is the yyyymm timestamp formatted above
## value_ is the reference to all the satellite images collected via our searchRDC query 
for key_, value_ in dict_month_items.items():
    filename = f'manifest_{key_}.json'
    with open(filename, 'w') as fp:
        json.dump(value_, fp)
    s3.meta.client.upload_file(filename, s3_bucket, s3_folder + '/' + filename)
    manifest.append(filename)
    os.remove(filename)
```

Contoh kode ini mengunggah `manifest.json` file induk yang menunjuk ke semua manifes lain yang diunggah ke Amazon S3. Ini juga menyimpan jalur ke variabel lokal:**s3\$1manifest\$1uri**. Anda akan menggunakan variabel itu lagi untuk menentukan sumber data input saat Anda menjalankan pekerjaan pemrosesan di langkah 4.

```
with open('manifest.json', 'w') as fp:
    json.dump(manifest, fp)
s3.meta.client.upload_file('manifest.json', s3_bucket, s3_folder + '/' + 'manifest.json')
os.remove('manifest.json')

s3_manifest_uri = f's3://{s3_bucket}/{s3_folder}/manifest.json'
```

Sekarang setelah Anda membuat file manifes masukan dan mengunggahnya, Anda dapat menulis skrip yang memproses data Anda dalam pekerjaan pemrosesan. Ini memproses data dari citra satelit, menghitung NDVI, dan kemudian mengembalikan hasilnya ke lokasi Amazon S3 yang berbeda.

## Tulis skrip yang menghitung NDVI
<a name="geospatial-custom-operations-script-mode"></a>

Amazon SageMaker Studio Classic mendukung penggunaan perintah sihir `%%writefile` sel. Setelah menjalankan sel dengan perintah ini, isinya akan disimpan ke direktori Studio Classic lokal Anda. Ini adalah kode khusus untuk menghitung NDVI. Namun, berikut ini dapat berguna ketika Anda menulis skrip Anda sendiri untuk pekerjaan pemrosesan:
+ Dalam wadah pekerjaan pemrosesan Anda, jalur lokal di dalam wadah harus dimulai dengan`/opt/ml/processing/`. Dalam contoh ini, **input\$1data\$1path = '/opt/ml/processing/input\$1data/' ** dan **processed\$1data\$1path = '/opt/ml/processing/output\$1data/'** ditentukan dengan cara itu.
+ Dengan Amazon SageMaker Processing,  skrip yang menjalankan pekerjaan pemrosesan dapat mengunggah data yang diproses langsung ke Amazon S3. Untuk melakukannya, pastikan peran eksekusi yang terkait dengan `ScriptProcessor` instans Anda memiliki persyaratan yang diperlukan untuk mengakses bucket S3. Anda juga dapat menentukan parameter output saat menjalankan pekerjaan pemrosesan Anda. Untuk mempelajari lebih lanjut, lihat [operasi `.run()` API](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ScriptProcessor.run) di *Amazon SageMaker Python* SDK. Dalam contoh kode ini, hasil pemrosesan data diunggah langsung ke Amazon S3.
+ Untuk mengelola ukuran Amazon yang EBScontainer dilampirkan ke pemrosesan Anda, gunakan parameternya. `volume_size_in_gb` Ukuran default kontainer adalah 30 GB. Anda juga dapat menggunakan library Python [Garbage Collector](https://docs.python.org/3/library/gc.html) secara opsional untuk mengelola penyimpanan di wadah Amazon EBS Anda.

  Contoh kode berikut memuat array ke dalam wadah pekerjaan pemrosesan. Saat array membangun dan mengisi memori, pekerjaan pemrosesan macet. Untuk mencegah kerusakan ini, contoh berikut berisi perintah yang menghapus array dari wadah pekerjaan pemrosesan. 

```
%%writefile compute_ndvi.py

import os
import pickle
import sys
import subprocess
import json
import rioxarray

if __name__ == "__main__":
    print("Starting processing")
    
    input_data_path = '/opt/ml/processing/input_data/'
    input_files = []
    
    for current_path, sub_dirs, files in os.walk(input_data_path):
        for file in files:
            if file.endswith(".json"):
                input_files.append(os.path.join(current_path, file))
    
    print("Received {} input_files: {}".format(len(input_files), input_files))

    items = []
    for input_file in input_files:
        full_file_path = os.path.join(input_data_path, input_file)
        print(full_file_path)
        with open(full_file_path, 'r') as f:
            items.append(json.load(f))
            
    items = [item for sub_items in items for item in sub_items]

    for item in items:
        red_uri = item["Assets"]["red"]["Href"]
        nir_uri = item["Assets"]["nir"]["Href"]

        red = rioxarray.open_rasterio(red_uri, masked=True)
        nir = rioxarray.open_rasterio(nir_uri, masked=True)

        ndvi = (nir - red)/ (nir + red)
        
        file_name = 'ndvi_' + item["Id"] + '.tif'
        output_path = '/opt/ml/processing/output_data'
        output_file_path = f"{output_path}/{file_name}"
        
        ndvi.rio.to_raster(output_file_path)
        print("Written output:", output_file_path)
```

Anda sekarang memiliki skrip yang dapat menghitung NDVI. Selanjutnya, Anda dapat membuat instance dari ScriptProcessor dan menjalankan pekerjaan Processing Anda.

## Membuat sebuah instance dari `ScriptProcessor` kelas
<a name="geospatial-custom-operations-create"></a>

Demo ini menggunakan [ScriptProcessor](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ScriptProcessor)kelas yang tersedia melalui Amazon SageMaker Python SDK. Pertama, Anda perlu membuat instance dari kelas, dan kemudian Anda dapat memulai pekerjaan Processing Anda dengan menggunakan `.run()` metode.

```
from sagemaker.processing import ScriptProcessor, ProcessingInput, ProcessingOutput

image_uri = '081189585635.dkr.ecr.us-west-2.amazonaws.com/sagemaker-geospatial-v1-0:latest'

processor = ScriptProcessor(
	command=['python3'],
	image_uri=image_uri,
	role=execution_role_arn,
	instance_count=4,
	instance_type='ml.m5.4xlarge',
	sagemaker_session=sm_session
)

print('Starting processing job.')
```

Ketika Anda memulai pekerjaan Processing Anda, Anda perlu menentukan [https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ProcessingInput](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ProcessingInput)objek. Dalam objek itu, Anda menentukan yang berikut:
+ Jalur ke file manifes yang Anda buat di langkah 2,**s3\$1manifest\$1uri**. Ini adalah sumber data input ke wadah.
+ Jalur ke tempat Anda ingin data input disimpan dalam wadah. Ini harus sesuai dengan jalur yang Anda tentukan dalam skrip Anda.
+ Gunakan `s3_data_type` parameter untuk menentukan input sebagai`"ManifestFile"`.

```
s3_output_prefix_url = f"s3://{s3_bucket}/{s3_folder}/output"

processor.run(
    code='compute_ndvi.py',
    inputs=[
        ProcessingInput(
            source=s3_manifest_uri,
            destination='/opt/ml/processing/input_data/',
            s3_data_type="ManifestFile",
            s3_data_distribution_type="ShardedByS3Key"
        ),
    ],
    outputs=[
        ProcessingOutput(
            source='/opt/ml/processing/output_data/',
            destination=s3_output_prefix_url,
            s3_upload_mode="Continuous"
        )
    ]
)
```

Contoh kode berikut menggunakan [`.describe()`metode](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html#sagemaker.processing.ProcessingJob.describe) untuk mendapatkan rincian pekerjaan Processing Anda.

```
preprocessing_job_descriptor = processor.jobs[-1].describe()
s3_output_uri = preprocessing_job_descriptor["ProcessingOutputConfig"]["Outputs"][0]["S3Output"]["S3Uri"]
print(s3_output_uri)
```

## Memvisualisasikan hasil Anda menggunakan `matplotlib`
<a name="geospatial-custom-operations-visual"></a>

Dengan pustaka Python [Matplotlib](https://matplotlib.org/stable/index.html), Anda dapat memplot data raster. Sebelum Anda memplot data, Anda perlu menghitung NDVI menggunakan gambar sampel dari satelit. Sentinel-2 Contoh kode berikut membuka array gambar menggunakan operasi `.open_rasterio()` API, dan kemudian menghitung NDVI menggunakan `nir` dan pita `red` gambar dari data satelit. Sentinel-2 

```
# Opens the python arrays 
import rioxarray

red_uri = items[25]["Assets"]["red"]["Href"]
nir_uri = items[25]["Assets"]["nir"]["Href"]

red = rioxarray.open_rasterio(red_uri, masked=True)
nir = rioxarray.open_rasterio(nir_uri, masked=True)

# Calculates the NDVI
ndvi = (nir - red)/ (nir + red)

# Common plotting library in Python 
import matplotlib.pyplot as plt

f, ax = plt.subplots(figsize=(18, 18))
ndvi.plot(cmap='viridis', ax=ax)
ax.set_title("NDVI for {}".format(items[25]["Id"]))
ax.set_axis_off()
plt.show()
```

Output dari contoh kode sebelumnya adalah citra satelit dengan nilai NDVI yang dilapis di atasnya. Nilai NDVI mendekati 1 menunjukkan banyak vegetasi yang ada, dan nilai mendekati 0 menunjukkan tidak ada vegetasi yang ditampilkan.

![\[Citra satelit Iowa utara dengan NDVI dilapisi di atasnya\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/ndvi-iowa.png)


Ini melengkapi demo penggunaan`ScriptProcessor`.