DEV Community

Eko Priyanto
Eko Priyanto

Posted on

Mengekstrak koordinat dari banyak file geojson

Image description
Suatu ketika saya dihadapkan pada banyak file geojson. Karena kebutuhan tertentu maka dirasa perlu untuk mengekstrak koordinatnya saja dari file-file tersebut.

Langkah:

  1. Membuat list file json ke sebuah file "list_json_files.txt"
  2. Membaca file json dan mendapatkan koordinat
  3. menyimpan ke database

Membuat file "list_json_files.txt"

<?php
function getJsonFiles($directory, $outputFile) {
    $files = [];

    // Menggunakan RecursiveDirectoryIterator untuk menelusuri semua folder dan sub-folder
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));

    foreach ($iterator as $file) {
        if ($file->isFile() && strtolower($file->getExtension()) === 'json') {
            $files[] = $file->getPathname();
        }
    }

    // Menyimpan hasil path file JSON ke dalam file teks
    file_put_contents($outputFile, implode(PHP_EOL, $files));

    echo "Path file JSON telah disimpan di: " . $outputFile . PHP_EOL;
}

// Tentukan folder utama dan file output
$directory = 'geojson'; // Ganti dengan path folder utama jika diperlukan
$outputFile = "list_json_files.txt";

// Panggil fungsi
getJsonFiles($directory, $outputFile);

Enter fullscreen mode Exit fullscreen mode

Membaca file json berdasar file list yang telah dibuat

<?php
//extract.php


$filePath = "list_json_files.txt"; // Nama file yang berisi daftar path JSON


// Pastikan file ada sebelum membaca
if (file_exists($filePath)) {
    $lines = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // Baca setiap baris

    foreach ($lines as $file) {



        $jsonData = file_get_contents($file);

        // Decode JSON menjadi array asosiatif
        $data = json_decode($jsonData, true);

        if ($data && $data['type'] === 'FeatureCollection' && isset($data['features'])) { 
            $coordinates = $data['features'][0]['geometry']['coordinates'];

        } else {
          echo "\033[31m [Invalid] \033[0m GeoJSON format - ".$file." \n";
        }

        if ($coordinates) {
            $koordinat = json_encode($coordinates);
            $nama_file = $filename = pathinfo($file, PATHINFO_FILENAME);

            echo $nama_file;

            echo "\033[32m [Berhasil] \033[0m\n";
        } else {
          echo "\033[31m [Error] \033[0m baca json - ".$file." \n";
        }

        //exit();



    }
} else {
    echo "File tidak ditemukan: $filePath" . PHP_EOL;
}

Enter fullscreen mode Exit fullscreen mode

Contoh di atas akan echo nama file json atau kode wilayah, yang akan disimpan ke database bersama geometri batas wilayah

Simpan di supabase

Buat table dengan nama geojson, kemudian buat strukturnya seperti ini. 2 kolom di atas adalah bawaan dari supabase

Image description

Jangan lupa bikin policy, disable LRS. biar bisa insert

Image description

Berikut script lengkapnya, jangan lupa ganti config supabasenya:

<?php
ini_set('memory_limit', '-1'); // Unlimited (gunakan dengan hati-hati)

// Supabase API Config
$supabaseUrl = 'https://nda5e.supabase.co';
$supabaseKey = 'ndi4s3nda5m03';

$table = "geojson";
$filePath = "list_json_files.txt"; // Nama file yang berisi daftar path JSON

function insertToSupabase($url, $key, $table, $data, $no, $kode) {
    $endpoint = "$url/rest/v1/$table";
    $headers = [
        "Content-Type: application/json",
        "apikey: $key",
        "Authorization: Bearer $key",
        "Prefer: return=minimal" // return=minimal agar tidak mengembalikan response panjang
    ];

    $ch = curl_init($endpoint);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode == 201 || $httpCode == 200) {
        echo "\033[32m [ ".$no." Sukses ] kode .$kode. berhasil disimpan ke Supabase.\033[0m\n";
    } else {
        echo "\033[31m [Gagal] ' .$kode. ' gagal disimpan: \033[0m  $response \n";
        exit();
    }
}

// Pastikan file ada sebelum membaca
if (file_exists($filePath)) {
    $lines = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // Baca setiap baris

    $no = 0;
    foreach ($lines as $file) {
        $no++;

        $jsonData = file_get_contents($file);
        $data = json_decode($jsonData, true);

        if ($data && $data['type'] === 'FeatureCollection' && isset($data['features'])) { 
            $coordinates = $data['features'][0]['geometry']['coordinates'];
        } else {
            echo "\033[31m [Invalid] \033[0m GeoJSON format - $file \n";
            continue;
        }

        if ($coordinates) {
            $koordinat = json_encode($coordinates);
            $nama_file = pathinfo($file, PATHINFO_FILENAME);

            //echo "\033[32m [Berhasil] Baris ke-$no: $nama_file \033[0m\n";

            // Kirim data ke Supabase
            $dataInsert = [
                "kode" => $nama_file,
                "koordinat" => $koordinat
            ];
            insertToSupabase($supabaseUrl, $supabaseKey, $table, $dataInsert, $no, $nama_file);
        } else {
            echo "\033[31m [Error] \033[0m Gagal membaca JSON - $file \n";
        }

        unset($jsonData, $data, $koordinat);
    }
} else {
    echo "\033[31m [ File tidak ditemukan ] \033[0m $filePath" . PHP_EOL;
}

Enter fullscreen mode Exit fullscreen mode

Contoh ketika dijalankan:

Image description

Hasil database

Image description

Top comments (0)