Membuat coordinate field di Nuxt.js dengan Vuetifyjs, Leafletjs, dan OpenStreetMap

Cover image

Kita akan membuat komponen koordinat dengan menggunakan text-field pada Vuetify, peta Leaflet pada nuxt-leaflet, dan juga pencarian dengan provider OpenStreetMap dengan leaflet-geosearch.

Langkah-langkah:

  1. Menginstall Nuxt
  2. Menginstall Vuetify
  3. Membuat komponen koordinat
  4. Menginstall Leaflet
  5. Memakai dialog dan peta OpenStreetMap

1. Menginstall Nuxt

Sesuai dengan panduan installasi Nuxt.js, pada kali ini saya menggunakan create-nuxt-app.

npx create-nuxt-app <project-name>

Kemudian pindah ke direktori tersebut dan jalankan pengembangan.

cd <project-name>
npm run dev

Jika sudah berhasil akan terlihat logo Nuxt.js.

2. Menginstall Vuetify

Pada kali ini saya menggunakan vuetify-module dari nuxt-community.

npm install--save @nuxtjs/vuetify

Tambahkan juga @nuxtjs/vuetify di modules pada nuxt.config.js

export default {
  modules: [
    '@nuxtjs/vuetify'
  ]
}

3. Membuat komponent koordinat

Buat file components/vuetify/CoordinateField.vue dengan text-field di dalamnya.

<template>
  <div>
    <v-text-field
      @change="textChange($event)"
      v-bind="$attrs"
      v-model="text.value"
      autocomplete="off"
      prepend-inner-icon="mdi-map-marker"
    >
    </v-text-field>
  </div>
</template>

<script>
export default {
  props: {
    value: {
      default: '0,0',
      type: String
    }
  },
  data() {
    return {
      text: {
        value: this.value
      }
    }
  },
  watch: {
    value: function(value) {
      this.text.value = value
    }
  },
  methods: {
    textChange(value) {
      this.$emit('input', value)
    }
  }
}
</script>

Dan ubah pages/index.vue untuk memanggil komponen tersebut.

<template>
  <v-container>
    <CoordinateField
      v-model="coordinate"
      clearable
      dense
      label="Coordinate"
      outlined
    />
  </v-container>
</template>

<script>
import CoordinateField from '~/components/vuetify/CoordinateField'

export default {
  components: {
    CoordinateField
  },
  data() {
    return {
      coordinate: '-6.229728,106.6894312'
    }
  }
}
</script>

Sehingga tampilan menjadi

coordinate-field

4. Menginstall Leaflet

Beberapa paket yang dipakai:

npm install --save nuxt-leaflet

Tambahkan nuxt-leaflet pada modules di nuxt.config.js.

{
  modules: [
    'nuxt-leaflet'
  ]
}
npm install --save vue2-leaflet-fullscreen

Saya juga membuat /plugins/leafleat.js untuk meregistrasi komponen LControlFullscreen

import Vue from 'vue'
import LControlFullscreen from 'vue2-leaflet-fullscreen'

Vue.component('l-control-fullscreen', LControlFullscreen)

Tambahkan leaflet.js dengan mode client pada plugins di nuxt.config.js

{
  plugins: [
    {
      mode: 'client',
      src: '~/plugins/leaflet'
    }
}
npm install --save leaflet-geosearch

Saya juga membuat /plugins/leafletGeosearch.js dan melakukan inject leafletGeosearch untuk meinisialisasi class OpenStreetMapProvider pada objek provider

import { OpenStreetMapProvider } from 'leaflet-geosearch'

export default (context, inject) => {
  const leafletGeosearch = {}
  leafletGeosearch.provider = new OpenStreetMapProvider()

  inject('leafletGeosearch', leafletGeosearch)
}

Tambahkan leafletGeosearch.js dengan mode client pada plugins di nuxt.config.js

{
  plugins: [
    {
      mode: 'client',
      src: '~/plugins/leafletGeosearch'
    }
}

5. Memakai dialog dan peta OpenStreetMap

Langkah-langkah:

  • Memakai komponen v-dialog
  • Menambahkan komponen l-map untuk menampilkan peta
  • Menambahkan komponent v-autocomplete pada l-control di l-map
  • Menambahkan metode mapSearchItemsFetch() untuk menggunakan $leafletGeosearch.provider.search()
  • Menambahkan komponen l-control-fullscreen untuk melakukan full screen
  • Menambahkan metode mapDrag() untuk memperbaharui latitude, longitude jika diseret
  • Menambahkan v-btn dengan icon gps, dan menambahkan metode mapGpsClick() untuk mendapatkan posisi saat ini

Demo