PHPackages                             mzm/geojson-converter - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. mzm/geojson-converter

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

mzm/geojson-converter
=====================

Tukar array Laravel ke format GeoJSON

v1.0.0(3mo ago)03↓90%MITPHP

Since Mar 27Pushed 3mo agoCompare

[ Source](https://github.com/mzm-dev/geojson-converter)[ Packagist](https://packagist.org/packages/mzm/geojson-converter)[ RSS](/packages/mzm-geojson-converter/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependencies (3)Versions (2)Used By (0)

mzm/geojson-converter
=====================

[](#mzmgeojson-converter)

Tukar array PHP/Laravel ke format **GeoJSON** (RFC 7946) dengan mudah — menyokong Point, LineString, Polygon dan jenis geometry yang lain.

---

Pemasangan
----------

[](#pemasangan)

```
composer require mzm/geojson-converter
```

Package ini menyokong Laravel auto-discovery. `GeoJsonServiceProvider` akan didaftarkan secara automatik.

---

Penggunaan
----------

[](#penggunaan)

### 1. Point — `fromPoints()`

[](#1-point--frompoints)

Untuk data yang mengandungi koordinat lat/lon secara berasingan.

```
use Mzm\GeoJsonConverter\GeoJsonConverter;

$data = [
    ['nama' => 'KL Tower', 'lat' => 3.1528,  'lon' => 101.7038],
    ['nama' => 'KLCC',     'lat' => 3.1579,  'lon' => 101.7119],
];

$geojson = GeoJsonConverter::fromPoints($data);
```

**Parameter:**

ParameterDefaultKeterangan`$data`—Array data`$latKey``'lat'`Nama kunci latitud`$lonKey``'lon'`Nama kunci longitud---

### 2. LineString — `fromLineStrings()`

[](#2-linestring--fromlinestrings)

Untuk data laluan atau garisan. Koordinat dalam format `[lon, lat]` mengikut standard GeoJSON.

```
$data = [
    [
        'nama'        => 'Laluan A',
        'coordinates' => [[101.70, 3.15], [101.71, 3.16], [101.72, 3.17]],
    ],
];

$geojson = GeoJsonConverter::fromLineStrings($data);
```

**Parameter:**

ParameterDefaultKeterangan`$data`—Array data`$coordinatesKey``'coordinates'`Nama kunci koordinat---

### 3. Polygon — `fromPolygons()`

[](#3-polygon--frompolygons)

Untuk data kawasan atau sempadan. Ring pertama mestilah **ditutup** (koordinat pertama == koordinat terakhir).

```
$data = [
    [
        'nama'        => 'Kawasan B',
        'coordinates' => [
            [
                [101.70, 3.15],
                [101.71, 3.15],
                [101.71, 3.16],
                [101.70, 3.16],
                [101.70, 3.15], // tutup semula
            ]
        ],
    ],
];

$geojson = GeoJsonConverter::fromPolygons($data);
```

**Parameter:**

ParameterDefaultKeterangan`$data`—Array data`$coordinatesKey``'coordinates'`Nama kunci koordinat---

### 4. Data dari Kolum `geom` (PostGIS / MySQL Spatial) — `fromWkt()`

[](#4-data-dari-kolum-geom-postgis--mysql-spatial--fromwkt)

#### Pra-Syarat

[](#pra-syarat)

Kolum `geom` dalam pangkalan data menyimpan geometri dalam format **WKB (Well-Known Binary)** — format binari yang tidak boleh terus ditukar. Perlu tukar kepada **WKT (Well-Known Text)** dalam query SQL terlebih dahulu menggunakan fungsi spatial:

Pangkalan DataFungsi SQLPostgreSQL/PostGIS`ST_AsText(geom)`MySQL 5.7+`ST_AsText(geom)`MariaDB`ST_AsText(geom)`**Contoh Query (Laravel Eloquent):**

```
// PostGIS
$data = DB::table('lokasi')
    ->selectRaw('ST_AsText(geom) AS geom, nama, kategori')
    ->get()
    ->toArray();

// MySQL Spatial
$data = DB::table('lokasi')
    ->selectRaw('ST_AsText(geom) AS geom, nama, kategori')
    ->get()
    ->toArray();
```

> **Alternatif lebih mudah:** Guna `ST_AsGeoJSON(geom)` dalam SQL untuk dapatkan GeoJSON terus dari pangkalan data tanpa package ini.

#### Penggunaan `fromWkt()`

[](#penggunaan-fromwkt)

Menyokong semua jenis geometry: `Point`, `LineString`, `Polygon`, `MultiPoint`, `MultiLineString`, `MultiPolygon`.

```
use Mzm\GeoJsonConverter\GeoJsonConverter;

// Data selepas ST_AsText(geom)
$data = [
    ['geom' => 'POINT(101.7038 3.1528)',                        'nama' => 'KL Tower'],
    ['geom' => 'LINESTRING(101.70 3.15, 101.71 3.16)',          'nama' => 'Jalan A'],
    ['geom' => 'POLYGON((101.70 3.15, 101.71 3.15, 101.70 3.15))', 'nama' => 'Kawasan B'],
];

$geojson = GeoJsonConverter::fromWkt($data);
```

**Parameter:**

ParameterDefaultKeterangan`$data`—Array data dengan WKT string`$geomKey``'geom'`Nama kunci kolum WKT**Format WKT yang disokong:**

JenisContoh WKTPoint`POINT(101.70 3.15)`LineString`LINESTRING(101.70 3.15, 101.71 3.16)`Polygon`POLYGON((101.70 3.15, 101.71 3.16, 101.70 3.15))`MultiPoint`MULTIPOINT(101.70 3.15, 101.71 3.16)`MultiLineString`MULTILINESTRING((101.70 3.15, 101.71 3.16),(101.72 3.17, 101.73 3.18))`MultiPolygon`MULTIPOLYGON(((101.70 3.15, 101.71 3.15, 101.70 3.15)))`---

### 5. Pelbagai Jenis Geometry — `fromMixed()`

[](#5-pelbagai-jenis-geometry--frommixed)

Untuk dataset yang mengandungi pelbagai jenis geometry sekaligus. Setiap item perlu menyatakan jenis geometrynya.

Jenis yang disokong: `Point`, `LineString`, `Polygon`, `MultiPoint`, `MultiLineString`, `MultiPolygon`.

```
$data = [
    [
        'geometry_type' => 'Point',
        'lat'           => 3.1528,
        'lon'           => 101.7038,
        'nama'          => 'KL Tower',
    ],
    [
        'geometry_type' => 'LineString',
        'coordinates'   => [[101.70, 3.15], [101.71, 3.16]],
        'nama'          => 'Jalan A',
    ],
    [
        'geometry_type' => 'Polygon',
        'coordinates'   => [
            [[101.70, 3.15], [101.71, 3.15], [101.71, 3.16], [101.70, 3.15]]
        ],
        'nama'          => 'Kawasan B',
    ],
];

$geojson = GeoJsonConverter::fromMixed($data);
```

**Parameter:**

ParameterDefaultKeterangan`$data`—Array data`$typeKey``'geometry_type'`Nama kunci jenis geometry`$coordinatesKey``'coordinates'`Nama kunci koordinat`$latKey``'lat'`Nama kunci latitud (untuk Point)`$lonKey``'lon'`Nama kunci longitud (untuk Point)---

### 6. `fromArray()` *(lama — backward-compatible)*

[](#6-fromarray-lama--backward-compatible)

Alias kepada `fromPoints()`. Masih berfungsi untuk kod sedia ada.

```
$geojson = GeoJsonConverter::fromArray($data);
```

---

Response HTTP GeoJSON
---------------------

[](#response-http-geojson)

Semua method convert di atas hanya memulangkan **string JSON**. Untuk API, gunakan kaedah `*Response()` yang terus memulangkan Laravel `Response` dengan header yang betul.

### Header yang ditetapkan secara automatik

[](#header-yang-ditetapkan-secara-automatik)

HeaderNilaiTujuan`Content-Type``application/geo+json`Standard MIME type untuk GeoJSON (RFC 7946)`Cache-Control``no-store`Elak cache data geospatial yang mungkin berubah### Method Response

[](#method-response)

Setiap method convert mempunyai pasangan `*Response()`:

Method Convert (string)Method Response (HTTP)`fromPoints(...)``pointsResponse(...)``fromLineStrings(...)``lineStringsResponse(...)``fromPolygons(...)``polygonsResponse(...)``fromWkt(...)``wktResponse(...)``fromMixed(...)``mixedResponse(...)`Semua method Response menerima parameter tambahan `$status` (HTTP status code, default `200`).

### Contoh Penggunaan dalam Controller

[](#contoh-penggunaan-dalam-controller)

```
use Mzm\GeoJsonConverter\GeoJsonConverter;

class LokasiController extends Controller
{
    // Data point — terus pulangkan response
    public function points()
    {
        $data = DB::table('lokasi')->select('nama', 'lat', 'lon')->get()->toArray();

        return GeoJsonConverter::pointsResponse($data);
    }

    // Data dari kolum geom (PostGIS/MySQL Spatial)
    public function spatial()
    {
        $data = DB::table('lokasi')
            ->selectRaw('ST_AsText(geom) AS geom, nama, kategori')
            ->get()
            ->toArray();

        return GeoJsonConverter::wktResponse($data);
    }

    // Dengan custom header tambahan
    public function withCustomHeader()
    {
        $data = DB::table('lokasi')->select('nama', 'lat', 'lon')->get()->toArray();

        return GeoJsonConverter::pointsResponse($data, status: 200);
    }
}
```

### Atau Gunakan `toResponse()` Secara Bebas

[](#atau-gunakan-toresponse-secara-bebas)

Jika sudah ada GeoJSON string (dari `ST_AsGeoJSON()` atau sumber lain), boleh wrap terus:

```
// GeoJSON terus dari PostGIS
$geojson = DB::selectOne('SELECT ST_AsGeoJSON(ST_Collect(geom)) AS geojson FROM lokasi')->geojson;

return GeoJsonConverter::toResponse($geojson);
```

---

Ringkasan Method
----------------

[](#ringkasan-method)

### Convert (pulangkan string)

[](#convert-pulangkan-string)

MethodGeometryInput koordinat`fromPoints($data, $latKey, $lonKey)`Point`'lat' => 3.15, 'lon' => 101.70``fromLineStrings($data, $coordinatesKey)`LineString`'coordinates' => [[lon,lat], ...]``fromPolygons($data, $coordinatesKey)`Polygon`'coordinates' => [[[lon,lat], ...]]``fromWkt($data, $geomKey)`Semua jenis (dari DB `geom`)`'geom' => 'POINT(101.70 3.15)'``fromMixed($data, $typeKey, ...)`Semua jenis`'geometry_type' => 'Point|LineString|...'``fromArray($data, $latKey, $lonKey)`Point *(alias)*`'lat' => 3.15, 'lon' => 101.70`### Response (pulangkan Laravel HTTP Response)

[](#response-pulangkan-laravel-http-response)

MethodKeterangan`pointsResponse($data, $latKey, $lonKey, $status)`Response untuk data point`lineStringsResponse($data, $coordinatesKey, $status)`Response untuk LineString`polygonsResponse($data, $coordinatesKey, $status)`Response untuk Polygon`wktResponse($data, $geomKey, $status)`Response untuk data WKT dari DB`mixedResponse($data, $typeKey, ..., $status)`Response untuk data pelbagai geometry`toResponse($geojson, $status, $headers)`Wrap GeoJSON string sedia ada ke Response---

Format Output
-------------

[](#format-output)

Semua method mengembalikan string JSON dalam format **GeoJSON FeatureCollection**:

```
{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [101.7038, 3.1528]
            },
            "properties": {
                "nama": "KL Tower"
            }
        }
    ]
}
```

> **Nota:** Koordinat GeoJSON menggunakan susunan `[longitud, latitud]` mengikut standard RFC 7946.

---

Maklumat Tambahan
-----------------

[](#maklumat-tambahan)

### Format Data Spatial dalam Pangkalan Data

[](#format-data-spatial-dalam-pangkalan-data)

Kolum geometry dalam pangkalan data wujud dalam beberapa format:

FormatNama PenuhPenerangan**WKB**Well-Known BinaryFormat **binari** lalai yang disimpan dalam DB — tidak boleh dibaca terus**WKT**Well-Known TextFormat **teks** yang boleh dibaca — hasil `ST_AsText()`**GeoJSON**—Format JSON standard — hasil `ST_AsGeoJSON()`**EWKT**Extended WKTWKT dengan maklumat SRID, contoh: `SRID=4326;POINT(...)` — khusus PostGIS### Pilih Pendekatan yang Sesuai

[](#pilih-pendekatan-yang-sesuai)

```
Data di DB (kolum geom/geometry)
│
├── Jika nak tukar kepada GeoJSON menggunakan package ini:
│   └── Guna ST_AsText(geom) dalam SQL  →  GeoJsonConverter::fromWkt($data)
│
└── Jika nak GeoJSON terus tanpa package ini:
    └── Guna ST_AsGeoJSON(geom) dalam SQL  →  terus encode ke JSON

```

### Contoh Lengkap: PostGIS dengan `fromWkt()`

[](#contoh-lengkap-postgis-dengan-fromwkt)

```
// 1. Query — tukar WKB kepada WKT dalam SQL
$rows = DB::table('lokasi')
    ->selectRaw('ST_AsText(geom) AS geom, nama, kategori, kawasan')
    ->where('aktif', true)
    ->get()
    ->toArray();

// 2. Tukar dan pulangkan sebagai HTTP Response (dengan header yang betul)
return GeoJsonConverter::wktResponse($rows);

// -- ATAU -- jika perlu string sahaja (contoh: simpan ke fail)
$geojson = GeoJsonConverter::fromWkt($rows);
```

### Contoh Lengkap: Alternatif Tanpa Package (`ST_AsGeoJSON`)

[](#contoh-lengkap-alternatif-tanpa-package-st_asgeojson)

Jika data hanya satu jenis geometry, boleh bypass package sepenuhnya:

```
// PostGIS — dapatkan geometry sebagai GeoJSON string terus dari DB
$rows = DB::table('lokasi')
    ->selectRaw('ST_AsGeoJSON(geom)::json AS geometry, nama, kategori')
    ->get();

// Bina FeatureCollection secara manual
$features = $rows->map(fn($row) => [
    'type'       => 'Feature',
    'geometry'   => json_decode($row->geometry),
    'properties' => ['nama' => $row->nama, 'kategori' => $row->kategori],
]);

$geojson = json_encode([
    'type'     => 'FeatureCollection',
    'features' => $features,
], JSON_PRETTY_PRINT);
```

> **Bil sebab guna package ini berbanding `ST_AsGeoJSON` terus:**
>
> - Data bercampur darielbagai sumber (bukan hanya DB)
> - Perlu kawalan penuh ke atas `properties`
> - Data dari CSV/Excel/API yang tiada fungsi spatial

### SRID dan Proyeksi

[](#srid-dan-proyeksi)

Package ini mengandaikan koordinat dalam **WGS 84 (SRID 4326)** — sistem koordinat standard untuk GeoJSON. Jika data dalam sistem koordinat lain (contoh: Malaysia GDM2000, MRSO), perlu tukar dahulu dalam SQL:

```
-- Tukar dari SRID 3168 (Kertau RSO) kepada WGS 84 (4326) dalam PostGIS
SELECT ST_AsText(ST_Transform(geom, 4326)) AS geom, nama FROM lokasi
```

---

Lesen
-----

[](#lesen)

This package is open-sourced software licensed under the MIT license. See the [LICENSE](LICENSE) file for more details.

###  Health Score

33

—

LowBetter than 72% of packages

Maintenance82

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity34

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

92d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/3121876?v=4)[Mohamad Zaki Mustafa](/maintainers/mzm-dev)[@mzm-dev](https://github.com/mzm-dev)

---

Top Contributors

[![mzm-dev](https://avatars.githubusercontent.com/u/3121876?v=4)](https://github.com/mzm-dev "mzm-dev (5 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/mzm-geojson-converter/health.svg)

```
[![Health](https://phpackages.com/badges/mzm-geojson-converter/health.svg)](https://phpackages.com/packages/mzm-geojson-converter)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.1M337](/packages/psalm-plugin-laravel)[renatomarinho/laravel-page-speed

Laravel Page Speed

2.5k1.7M11](/packages/renatomarinho-laravel-page-speed)[illuminate/pipeline

The Illuminate Pipeline package.

9348.3M267](/packages/illuminate-pipeline)[illuminate/pagination

The Illuminate Pagination package.

10533.5M991](/packages/illuminate-pagination)[illuminate/redis

The Illuminate Redis package.

8314.4M362](/packages/illuminate-redis)[illuminate/cookie

The Illuminate Cookie package.

224.5M132](/packages/illuminate-cookie)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
