Autosave: 20260618-041215
This commit is contained in:
parent
05b4206387
commit
ecb978b657
0
assets/pasted-20260618-024402-bb515c3e.png
Normal file
0
assets/pasted-20260618-024402-bb515c3e.png
Normal file
0
assets/pasted-20260618-024633-c22dab27.png
Normal file
0
assets/pasted-20260618-024633-c22dab27.png
Normal file
0
assets/pasted-20260618-040907-6c3e34bf.png
Normal file
0
assets/pasted-20260618-040907-6c3e34bf.png
Normal file
905
backend/src/scripts/geoseek/generateGeoPlacesCsv.js
Normal file
905
backend/src/scripts/geoseek/generateGeoPlacesCsv.js
Normal file
@ -0,0 +1,905 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { once } = require('events');
|
||||
|
||||
const WORKSPACE_ROOT = path.resolve(__dirname, '../../../..');
|
||||
const DEFAULT_ROWS = 1000000;
|
||||
const DEFAULT_OUTPUT = path.join(
|
||||
WORKSPACE_ROOT,
|
||||
'data/geoseek/generated/geo_places_1M.csv',
|
||||
);
|
||||
|
||||
const HEADER = [
|
||||
'id',
|
||||
'nama_tempat',
|
||||
'kategori',
|
||||
'subkategori',
|
||||
'alamat',
|
||||
'kecamatan',
|
||||
'kota',
|
||||
'provinsi',
|
||||
'latitude',
|
||||
'longitude',
|
||||
'no_telp',
|
||||
'jam_operasional',
|
||||
'rating',
|
||||
'jumlah_review',
|
||||
'sumber_data',
|
||||
'status_verifikasi',
|
||||
];
|
||||
|
||||
const CITY_TARGETS = [
|
||||
{
|
||||
kota: 'Jakarta',
|
||||
provinsi: 'DKI Jakarta',
|
||||
target: 200000,
|
||||
lat: -6.2,
|
||||
lng: 106.8167,
|
||||
phonePrefix: '021',
|
||||
districts: [
|
||||
'Menteng',
|
||||
'Gambir',
|
||||
'Tanah Abang',
|
||||
'Setiabudi',
|
||||
'Tebet',
|
||||
'Kebayoran Baru',
|
||||
'Cilandak',
|
||||
'Kebon Jeruk',
|
||||
'Taman Sari',
|
||||
'Kelapa Gading',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Surabaya',
|
||||
provinsi: 'Jawa Timur',
|
||||
target: 100000,
|
||||
lat: -7.2575,
|
||||
lng: 112.7521,
|
||||
phonePrefix: '031',
|
||||
districts: [
|
||||
'Tegalsari',
|
||||
'Genteng',
|
||||
'Gubeng',
|
||||
'Wonokromo',
|
||||
'Sukolilo',
|
||||
'Rungkut',
|
||||
'Bubutan',
|
||||
'Kenjeran',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Bandung',
|
||||
provinsi: 'Jawa Barat',
|
||||
target: 90000,
|
||||
lat: -6.9175,
|
||||
lng: 107.6191,
|
||||
phonePrefix: '022',
|
||||
districts: [
|
||||
'Coblong',
|
||||
'Sumur Bandung',
|
||||
'Bandung Wetan',
|
||||
'Regol',
|
||||
'Cicendo',
|
||||
'Sukajadi',
|
||||
'Batununggal',
|
||||
'Lengkong',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Medan',
|
||||
provinsi: 'Sumatera Utara',
|
||||
target: 80000,
|
||||
lat: 3.5952,
|
||||
lng: 98.6722,
|
||||
phonePrefix: '061',
|
||||
districts: [
|
||||
'Medan Baru',
|
||||
'Medan Kota',
|
||||
'Medan Petisah',
|
||||
'Medan Timur',
|
||||
'Medan Selayang',
|
||||
'Medan Amplas',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Bekasi',
|
||||
provinsi: 'Jawa Barat',
|
||||
target: 70000,
|
||||
lat: -6.2383,
|
||||
lng: 106.9756,
|
||||
phonePrefix: '021',
|
||||
districts: [
|
||||
'Bekasi Selatan',
|
||||
'Bekasi Timur',
|
||||
'Bekasi Barat',
|
||||
'Bekasi Utara',
|
||||
'Rawalumbu',
|
||||
'Jatiasih',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Tangerang',
|
||||
provinsi: 'Banten',
|
||||
target: 70000,
|
||||
lat: -6.1783,
|
||||
lng: 106.6319,
|
||||
phonePrefix: '021',
|
||||
districts: [
|
||||
'Tangerang',
|
||||
'Cipondoh',
|
||||
'Karawaci',
|
||||
'Ciledug',
|
||||
'Pinang',
|
||||
'Benda',
|
||||
'Kelapa Dua',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Semarang',
|
||||
provinsi: 'Jawa Tengah',
|
||||
target: 60000,
|
||||
lat: -6.9667,
|
||||
lng: 110.4167,
|
||||
phonePrefix: '024',
|
||||
districts: [
|
||||
'Semarang Tengah',
|
||||
'Semarang Selatan',
|
||||
'Semarang Timur',
|
||||
'Tembalang',
|
||||
'Banyumanik',
|
||||
'Pedurungan',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Makassar',
|
||||
provinsi: 'Sulawesi Selatan',
|
||||
target: 50000,
|
||||
lat: -5.1477,
|
||||
lng: 119.4327,
|
||||
phonePrefix: '0411',
|
||||
districts: [
|
||||
'Ujung Pandang',
|
||||
'Panakkukang',
|
||||
'Rappocini',
|
||||
'Tamalanrea',
|
||||
'Biringkanaya',
|
||||
'Manggala',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Palembang',
|
||||
provinsi: 'Sumatera Selatan',
|
||||
target: 45000,
|
||||
lat: -2.9761,
|
||||
lng: 104.7754,
|
||||
phonePrefix: '0711',
|
||||
districts: [
|
||||
'Ilir Barat I',
|
||||
'Ilir Timur I',
|
||||
'Bukit Kecil',
|
||||
'Kemuning',
|
||||
'Sukarami',
|
||||
'Seberang Ulu I',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Depok',
|
||||
provinsi: 'Jawa Barat',
|
||||
target: 45000,
|
||||
lat: -6.4025,
|
||||
lng: 106.7942,
|
||||
phonePrefix: '021',
|
||||
districts: ['Beji', 'Pancoran Mas', 'Sukmajaya', 'Cimanggis', 'Sawangan'],
|
||||
},
|
||||
{
|
||||
kota: 'Bogor',
|
||||
provinsi: 'Jawa Barat',
|
||||
target: 40000,
|
||||
lat: -6.5971,
|
||||
lng: 106.806,
|
||||
phonePrefix: '0251',
|
||||
districts: [
|
||||
'Bogor Tengah',
|
||||
'Bogor Utara',
|
||||
'Bogor Selatan',
|
||||
'Bogor Timur',
|
||||
'Tanah Sareal',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Yogyakarta',
|
||||
provinsi: 'DI Yogyakarta',
|
||||
target: 35000,
|
||||
lat: -7.7956,
|
||||
lng: 110.3695,
|
||||
phonePrefix: '0274',
|
||||
districts: [
|
||||
'Gedongtengen',
|
||||
'Gondomanan',
|
||||
'Kotagede',
|
||||
'Umbulharjo',
|
||||
'Gondokusuman',
|
||||
'Danurejan',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Denpasar',
|
||||
provinsi: 'Bali',
|
||||
target: 30000,
|
||||
lat: -8.6705,
|
||||
lng: 115.2126,
|
||||
phonePrefix: '0361',
|
||||
districts: [
|
||||
'Denpasar Barat',
|
||||
'Denpasar Selatan',
|
||||
'Denpasar Timur',
|
||||
'Denpasar Utara',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Malang',
|
||||
provinsi: 'Jawa Timur',
|
||||
target: 30000,
|
||||
lat: -7.9666,
|
||||
lng: 112.6326,
|
||||
phonePrefix: '0341',
|
||||
districts: ['Klojen', 'Blimbing', 'Lowokwaru', 'Sukun', 'Kedungkandang'],
|
||||
},
|
||||
{
|
||||
kota: 'Kota lain',
|
||||
provinsi: 'Nasional',
|
||||
target: 85000,
|
||||
lat: -2.5489,
|
||||
lng: 118.0149,
|
||||
phonePrefix: '021',
|
||||
districts: ['Pusat Kota', 'Kecamatan Utama', 'Kawasan Niaga'],
|
||||
},
|
||||
];
|
||||
|
||||
const OTHER_CITIES = [
|
||||
{
|
||||
kota: 'Batam',
|
||||
provinsi: 'Kepulauan Riau',
|
||||
lat: 1.1301,
|
||||
lng: 104.0529,
|
||||
phonePrefix: '0778',
|
||||
districts: ['Batam Kota', 'Sekupang', 'Lubuk Baja', 'Batu Aji'],
|
||||
},
|
||||
{
|
||||
kota: 'Pekanbaru',
|
||||
provinsi: 'Riau',
|
||||
lat: 0.5071,
|
||||
lng: 101.4478,
|
||||
phonePrefix: '0761',
|
||||
districts: ['Sukajadi', 'Tampan', 'Marpoyan Damai', 'Tenayan Raya'],
|
||||
},
|
||||
{
|
||||
kota: 'Padang',
|
||||
provinsi: 'Sumatera Barat',
|
||||
lat: -0.9471,
|
||||
lng: 100.4172,
|
||||
phonePrefix: '0751',
|
||||
districts: ['Padang Barat', 'Padang Timur', 'Koto Tangah', 'Lubuk Begalung'],
|
||||
},
|
||||
{
|
||||
kota: 'Balikpapan',
|
||||
provinsi: 'Kalimantan Timur',
|
||||
lat: -1.2379,
|
||||
lng: 116.8529,
|
||||
phonePrefix: '0542',
|
||||
districts: [
|
||||
'Balikpapan Kota',
|
||||
'Balikpapan Selatan',
|
||||
'Balikpapan Utara',
|
||||
],
|
||||
},
|
||||
{
|
||||
kota: 'Banjarmasin',
|
||||
provinsi: 'Kalimantan Selatan',
|
||||
lat: -3.3186,
|
||||
lng: 114.5944,
|
||||
phonePrefix: '0511',
|
||||
districts: ['Banjarmasin Tengah', 'Banjarmasin Timur', 'Banjarmasin Utara'],
|
||||
},
|
||||
{
|
||||
kota: 'Pontianak',
|
||||
provinsi: 'Kalimantan Barat',
|
||||
lat: -0.0263,
|
||||
lng: 109.3425,
|
||||
phonePrefix: '0561',
|
||||
districts: ['Pontianak Kota', 'Pontianak Selatan', 'Pontianak Timur'],
|
||||
},
|
||||
{
|
||||
kota: 'Manado',
|
||||
provinsi: 'Sulawesi Utara',
|
||||
lat: 1.4748,
|
||||
lng: 124.8421,
|
||||
phonePrefix: '0431',
|
||||
districts: ['Wenang', 'Malalayang', 'Mapanget', 'Tuminting'],
|
||||
},
|
||||
{
|
||||
kota: 'Mataram',
|
||||
provinsi: 'Nusa Tenggara Barat',
|
||||
lat: -8.5833,
|
||||
lng: 116.1167,
|
||||
phonePrefix: '0370',
|
||||
districts: ['Mataram', 'Cakranegara', 'Ampenan', 'Sekarbela'],
|
||||
},
|
||||
{
|
||||
kota: 'Ambon',
|
||||
provinsi: 'Maluku',
|
||||
lat: -3.6954,
|
||||
lng: 128.1814,
|
||||
phonePrefix: '0911',
|
||||
districts: ['Sirimau', 'Nusaniwe', 'Baguala'],
|
||||
},
|
||||
{
|
||||
kota: 'Jayapura',
|
||||
provinsi: 'Papua',
|
||||
lat: -2.5916,
|
||||
lng: 140.669,
|
||||
phonePrefix: '0967',
|
||||
districts: ['Jayapura Utara', 'Jayapura Selatan', 'Abepura', 'Heram'],
|
||||
},
|
||||
];
|
||||
|
||||
const CATEGORY_DEFINITIONS = [
|
||||
{
|
||||
kategori: 'Restoran',
|
||||
subcategories: ['Makanan Sunda', 'Nasi Padang', 'Bakso', 'Sate', 'Seafood'],
|
||||
target: 150000,
|
||||
prefixes: ['Warung', 'Rumah Makan', 'Dapur', 'Resto'],
|
||||
nouns: ['Nusantara', 'Sederhana', 'Ibu Sari', 'Pak Rudi', 'Selera Kota'],
|
||||
openingHours: ['07:00-22:00', '08:00-23:00', '10:00-22:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Cafe',
|
||||
subcategories: ['Coffee Shop', 'Kedai Kopi', 'Dessert Cafe', 'Tea House'],
|
||||
target: 50000,
|
||||
prefixes: ['Cafe', 'Kedai Kopi', 'Coffee House', 'Kopi'],
|
||||
nouns: ['Senja', 'Urban', 'Teras', 'Kota', 'Ruang Temu'],
|
||||
openingHours: ['08:00-23:00', '09:00-22:00', '10:00-24:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Hotel',
|
||||
subcategories: ['Hotel Bintang 3', 'Hotel Bintang 4', 'Hotel Bintang 5'],
|
||||
target: 40000,
|
||||
prefixes: ['Hotel', 'Grand Hotel', 'Royal Hotel', 'City Hotel'],
|
||||
nouns: ['Nusantara', 'Sentral', 'Prima', 'Indah', 'Metropolitan'],
|
||||
openingHours: ['24 Jam'],
|
||||
},
|
||||
{
|
||||
kategori: 'Rumah Sakit',
|
||||
subcategories: ['Rumah Sakit Umum', 'Rumah Sakit Ibu dan Anak'],
|
||||
target: 25000,
|
||||
prefixes: ['RS', 'Rumah Sakit', 'RSU'],
|
||||
nouns: ['Sehat Sentosa', 'Medika', 'Harapan', 'Bunda', 'Kasih Ibu'],
|
||||
openingHours: ['24 Jam'],
|
||||
},
|
||||
{
|
||||
kategori: 'Apotek',
|
||||
subcategories: ['Apotek Umum', 'Farmasi', 'Toko Obat'],
|
||||
target: 50000,
|
||||
prefixes: ['Apotek', 'Farmasi', 'Toko Obat'],
|
||||
nouns: ['Sehat', 'Keluarga', 'Medika', 'Prima', 'Sentosa'],
|
||||
openingHours: ['08:00-22:00', '07:00-21:00', '24 Jam'],
|
||||
},
|
||||
{
|
||||
kategori: 'ATM',
|
||||
subcategories: ['ATM Bank', 'ATM Center'],
|
||||
target: 25000,
|
||||
prefixes: ['ATM', 'ATM Center'],
|
||||
nouns: ['Mandiri', 'BRI', 'BNI', 'BCA', 'CIMB Niaga'],
|
||||
openingHours: ['24 Jam'],
|
||||
},
|
||||
{
|
||||
kategori: 'SPBU',
|
||||
subcategories: ['Pom Bensin', 'Stasiun Pengisian BBM'],
|
||||
target: 15000,
|
||||
prefixes: ['SPBU', 'Pom Bensin'],
|
||||
nouns: ['Pertamina', 'Shell', 'BP AKR', 'Vivo', 'Kota'],
|
||||
openingHours: ['24 Jam', '05:00-23:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Bengkel',
|
||||
subcategories: ['Bengkel Motor', 'Bengkel Mobil', 'Service AC Mobil'],
|
||||
target: 50000,
|
||||
prefixes: ['Bengkel', 'Auto Service', 'Service Motor'],
|
||||
nouns: ['Maju Jaya', 'Prima Motor', 'Karya Auto', 'Mandiri', 'Sentosa'],
|
||||
openingHours: ['08:00-17:00', '08:00-20:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Wisata',
|
||||
subcategories: ['Tempat Wisata', 'Taman', 'Museum', 'Pantai'],
|
||||
target: 50000,
|
||||
prefixes: ['Wisata', 'Taman', 'Museum', 'Kawasan'],
|
||||
nouns: ['Kota', 'Budaya', 'Bahari', 'Alam Indah', 'Heritage'],
|
||||
openingHours: ['08:00-17:00', '09:00-18:00', '24 Jam'],
|
||||
},
|
||||
{
|
||||
kategori: 'Mall',
|
||||
subcategories: ['Pusat Perbelanjaan', 'Trade Center'],
|
||||
target: 30000,
|
||||
prefixes: ['Mall', 'Plaza', 'Trade Center'],
|
||||
nouns: ['Sentral', 'City Square', 'Metropolitan', 'Garden', 'Junction'],
|
||||
openingHours: ['10:00-22:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Minimarket',
|
||||
subcategories: ['Toko Harian', 'Convenience Store'],
|
||||
target: 30000,
|
||||
prefixes: ['Minimarket', 'Toko Harian', 'Gerai'],
|
||||
nouns: ['Kita', 'Maju', 'Sejahtera', 'Keluarga', 'Hemat'],
|
||||
openingHours: ['07:00-22:00', '24 Jam'],
|
||||
},
|
||||
{
|
||||
kategori: 'Klinik',
|
||||
subcategories: ['Klinik Umum', 'Klinik Gigi', 'Klinik Kecantikan'],
|
||||
target: 15000,
|
||||
prefixes: ['Klinik', 'Klinik Pratama', 'Medical Center'],
|
||||
nouns: ['Sehat', 'Medika', 'Utama', 'Prima', 'Keluarga'],
|
||||
openingHours: ['08:00-20:00', '09:00-21:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Dokter',
|
||||
subcategories: ['Praktik Dokter', 'Dokter Gigi', 'Dokter Anak'],
|
||||
target: 15000,
|
||||
prefixes: ['Praktik Dokter', 'Dokter', 'Klinik Dokter'],
|
||||
nouns: ['dr Andi', 'dr Sari', 'dr Budi', 'dr Ratna', 'dr Hadi'],
|
||||
openingHours: ['16:00-21:00', '09:00-15:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Laundry',
|
||||
subcategories: ['Laundry Kiloan', 'Dry Cleaning', 'Laundry Sepatu'],
|
||||
target: 40000,
|
||||
prefixes: ['Laundry', 'Cuci Express', 'Dry Clean'],
|
||||
nouns: ['Cepat', 'Bersih', 'Wangi', 'Fresh', 'Kilat'],
|
||||
openingHours: ['07:00-21:00', '08:00-20:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Bank',
|
||||
subcategories: ['Kantor Bank', 'Cabang Bank'],
|
||||
target: 15000,
|
||||
prefixes: ['Bank', 'Kantor Cabang'],
|
||||
nouns: ['Mandiri', 'BRI', 'BNI', 'BCA', 'BTN'],
|
||||
openingHours: ['08:00-15:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Sekolah',
|
||||
subcategories: ['SD', 'SMP', 'SMA', 'SMK'],
|
||||
target: 50000,
|
||||
prefixes: ['Sekolah', 'SD', 'SMP', 'SMA', 'SMK'],
|
||||
nouns: ['Negeri', 'Harapan Bangsa', 'Bina Insani', 'Cendekia', 'Nusantara'],
|
||||
openingHours: ['07:00-15:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Kampus',
|
||||
subcategories: ['Perguruan Tinggi', 'Akademi', 'Politeknik'],
|
||||
target: 30000,
|
||||
prefixes: ['Universitas', 'Politeknik', 'Institut', 'Akademi'],
|
||||
nouns: ['Nusantara', 'Teknologi', 'Mandiri', 'Cendekia', 'Indonesia'],
|
||||
openingHours: ['07:00-18:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Masjid',
|
||||
subcategories: ['Masjid', 'Mushola', 'Masjid Raya'],
|
||||
target: 110000,
|
||||
prefixes: ['Masjid', 'Mushola'],
|
||||
nouns: ['Al Ikhlas', 'Al Hidayah', 'At Taqwa', 'Nurul Iman', 'Baiturrahman'],
|
||||
openingHours: ['24 Jam'],
|
||||
},
|
||||
{
|
||||
kategori: 'Gereja',
|
||||
subcategories: ['Gereja', 'Kapel'],
|
||||
target: 40000,
|
||||
prefixes: ['Gereja', 'Kapel'],
|
||||
nouns: ['Bethel', 'Kristus Raja', 'Immanuel', 'Maranatha', 'Santo Yosef'],
|
||||
openingHours: ['06:00-20:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Penginapan',
|
||||
subcategories: ['Guest House', 'Homestay', 'Losmen'],
|
||||
target: 25000,
|
||||
prefixes: ['Guest House', 'Homestay', 'Penginapan'],
|
||||
nouns: ['Nyaman', 'Asri', 'Indah', 'Keluarga', 'Transit'],
|
||||
openingHours: ['24 Jam'],
|
||||
},
|
||||
{
|
||||
kategori: 'Kost',
|
||||
subcategories: ['Kost Putra', 'Kost Putri', 'Kost Campur'],
|
||||
target: 30000,
|
||||
prefixes: ['Kost', 'Rumah Kost', 'Kost Eksklusif'],
|
||||
nouns: ['Nyaman', 'Dago', 'Mawar', 'Melati', 'Transit'],
|
||||
openingHours: ['08:00-20:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Pasar',
|
||||
subcategories: ['Pasar Tradisional', 'Pasar Modern', 'Pasar Grosir'],
|
||||
target: 25000,
|
||||
prefixes: ['Pasar', 'Pasar Modern', 'Pusat Grosir'],
|
||||
nouns: ['Sentral', 'Rakyat', 'Induk', 'Pagi', 'Kota'],
|
||||
openingHours: ['05:00-17:00', '06:00-18:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Rental Mobil',
|
||||
subcategories: ['Sewa Mobil', 'Rental Harian'],
|
||||
target: 15000,
|
||||
prefixes: ['Rental Mobil', 'Sewa Mobil', 'Rent Car'],
|
||||
nouns: ['Prima', 'Mandiri', 'Jaya', 'Travelink', 'Kota'],
|
||||
openingHours: ['08:00-21:00', '24 Jam'],
|
||||
},
|
||||
{
|
||||
kategori: 'Rental Motor',
|
||||
subcategories: ['Sewa Motor', 'Rental Harian'],
|
||||
target: 10000,
|
||||
prefixes: ['Rental Motor', 'Sewa Motor'],
|
||||
nouns: ['Cepat', 'Kita', 'Mandiri', 'Prima', 'Kota'],
|
||||
openingHours: ['08:00-21:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Salon',
|
||||
subcategories: ['Salon Kecantikan', 'Hair Studio'],
|
||||
target: 20000,
|
||||
prefixes: ['Salon', 'Beauty Studio', 'Hair Salon'],
|
||||
nouns: ['Cantik', 'Mawar', 'Ayu', 'Glow', 'Ratu'],
|
||||
openingHours: ['09:00-21:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Barbershop',
|
||||
subcategories: ['Pangkas Rambut', 'Mens Grooming'],
|
||||
target: 20000,
|
||||
prefixes: ['Barbershop', 'Pangkas Rambut', 'Urban Cut'],
|
||||
nouns: ['Keren', 'Rapi', 'Gentleman', 'Kota', 'Prime'],
|
||||
openingHours: ['10:00-22:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Gym',
|
||||
subcategories: ['Pusat Kebugaran', 'Fitness Center'],
|
||||
target: 15000,
|
||||
prefixes: ['Gym', 'Fitness Center', 'Fit Club'],
|
||||
nouns: ['Prima', 'Urban', 'Strong', 'Sehat', 'Active'],
|
||||
openingHours: ['06:00-22:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Kolam Renang',
|
||||
subcategories: ['Kolam Renang Umum', 'Waterpark'],
|
||||
target: 10000,
|
||||
prefixes: ['Kolam Renang', 'Waterpark'],
|
||||
nouns: ['Tirta', 'Bahagia', 'Keluarga', 'Segar', 'Aqua'],
|
||||
openingHours: ['07:00-18:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Toko Bangunan',
|
||||
subcategories: ['Material Bangunan', 'Perkakas', 'Cat'],
|
||||
target: 40000,
|
||||
prefixes: ['Toko Bangunan', 'Material', 'Depo Bangunan'],
|
||||
nouns: ['Maju Jaya', 'Mandiri', 'Sentosa', 'Karya', 'Prima'],
|
||||
openingHours: ['08:00-17:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Toko Elektronik',
|
||||
subcategories: ['Elektronik & Gadget', 'Komputer', 'Aksesoris HP'],
|
||||
target: 35000,
|
||||
prefixes: ['Toko Elektronik', 'Gadget Store', 'Computer Center'],
|
||||
nouns: ['Nusantara', 'Digital', 'Prima', 'Jaya', 'Mega'],
|
||||
openingHours: ['09:00-21:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Toko Pakaian',
|
||||
subcategories: ['Fashion', 'Butik', 'Distro'],
|
||||
target: 35000,
|
||||
prefixes: ['Toko Pakaian', 'Butik', 'Distro'],
|
||||
nouns: ['Cantik', 'Modis', 'Urban', 'Mawar', 'Kota'],
|
||||
openingHours: ['09:00-21:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Logistik',
|
||||
subcategories: ['Jasa Pengiriman', 'Cargo', 'Ekspedisi'],
|
||||
target: 20000,
|
||||
prefixes: ['Ekspedisi', 'Cargo', 'Logistik'],
|
||||
nouns: ['Cepat', 'Nusantara', 'Express', 'Kilat', 'Jaya'],
|
||||
openingHours: ['08:00-20:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Kurir',
|
||||
subcategories: ['Jasa Kurir Lokal', 'Same Day Delivery'],
|
||||
target: 10000,
|
||||
prefixes: ['Kurir', 'Delivery', 'Jasa Kurir'],
|
||||
nouns: ['Cepat', 'Kilat', 'Kota', 'Express', 'Mandiri'],
|
||||
openingHours: ['08:00-22:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'Jasa',
|
||||
subcategories: ['Layanan Umum', 'Service AC', 'Jasa Kebersihan'],
|
||||
target: 30000,
|
||||
prefixes: ['Jasa', 'Layanan', 'Service'],
|
||||
nouns: ['Mandiri', 'Cepat', 'Profesional', 'Prima', 'Kota'],
|
||||
openingHours: ['08:00-18:00'],
|
||||
},
|
||||
{
|
||||
kategori: 'UMKM',
|
||||
subcategories: ['Usaha Lokal', 'Produk Rumahan', 'Kerajinan'],
|
||||
target: 75000,
|
||||
prefixes: ['UMKM', 'Toko', 'Produk Lokal'],
|
||||
nouns: ['Mandiri', 'Kreatif', 'Nusantara', 'Rumahan', 'Karya'],
|
||||
openingHours: ['08:00-21:00'],
|
||||
},
|
||||
];
|
||||
|
||||
const STREET_NAMES = [
|
||||
'Jl Sudirman',
|
||||
'Jl Ahmad Yani',
|
||||
'Jl Merdeka',
|
||||
'Jl Diponegoro',
|
||||
'Jl Gatot Subroto',
|
||||
'Jl Gajah Mada',
|
||||
'Jl Veteran',
|
||||
'Jl Pemuda',
|
||||
'Jl Pahlawan',
|
||||
'Jl Kartini',
|
||||
'Jl Imam Bonjol',
|
||||
'Jl Asia Afrika',
|
||||
'Jl Nusantara',
|
||||
'Jl Raya Kota',
|
||||
'Jl Pasar Baru',
|
||||
];
|
||||
|
||||
function resolveWorkspacePath(inputPath) {
|
||||
const resolvedPath = path.resolve(WORKSPACE_ROOT, inputPath);
|
||||
const relativePath = path.relative(WORKSPACE_ROOT, resolvedPath);
|
||||
|
||||
if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
|
||||
throw new Error('--output must stay inside the workspace root');
|
||||
}
|
||||
|
||||
return resolvedPath;
|
||||
}
|
||||
|
||||
function parseArgs(argv) {
|
||||
return argv.slice(2).reduce(
|
||||
(acc, item) => {
|
||||
if (item.startsWith('--rows=')) {
|
||||
acc.rows = Number(item.split('=')[1]);
|
||||
} else if (item.startsWith('--output=')) {
|
||||
acc.output = resolveWorkspacePath(item.split('=')[1]);
|
||||
} else if (item === '--help' || item === '-h') {
|
||||
acc.help = true;
|
||||
}
|
||||
|
||||
return acc;
|
||||
},
|
||||
{ rows: DEFAULT_ROWS, output: DEFAULT_OUTPUT, help: false },
|
||||
);
|
||||
}
|
||||
|
||||
function printHelp() {
|
||||
console.log(`GeoSeek CSV Generator\n\nUsage:\n node backend/src/scripts/geoseek/generateGeoPlacesCsv.js --rows=1000000 --output=data/geoseek/generated/geo_places_1M.csv\n\nNotes:\n - Generated rows are synthetic development seed data, not verified real POI.\n - The generator streams CSV output, so it can create large files without holding all rows in memory.\n`);
|
||||
}
|
||||
|
||||
function createSeededRandom(seed) {
|
||||
let value = seed % 2147483647;
|
||||
|
||||
if (value <= 0) {
|
||||
value += 2147483646;
|
||||
}
|
||||
|
||||
return () => {
|
||||
value = (value * 16807) % 2147483647;
|
||||
return (value - 1) / 2147483646;
|
||||
};
|
||||
}
|
||||
|
||||
const random = createSeededRandom(20260618);
|
||||
|
||||
function pick(items) {
|
||||
return items[Math.floor(random() * items.length)];
|
||||
}
|
||||
|
||||
function weightedPick(items, weightKey = 'target') {
|
||||
const totalWeight = items.reduce((sum, item) => sum + item[weightKey], 0);
|
||||
let cursor = random() * totalWeight;
|
||||
|
||||
for (const item of items) {
|
||||
cursor -= item[weightKey];
|
||||
if (cursor <= 0) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
return items[items.length - 1];
|
||||
}
|
||||
|
||||
function allocateCounts(totalRows, targets) {
|
||||
const totalTarget = targets.reduce((sum, item) => sum + item.target, 0);
|
||||
const rawAllocations = targets.map((item) => {
|
||||
const exact = (item.target / totalTarget) * totalRows;
|
||||
|
||||
return {
|
||||
...item,
|
||||
count: Math.floor(exact),
|
||||
remainder: exact - Math.floor(exact),
|
||||
};
|
||||
});
|
||||
let remaining = totalRows - rawAllocations.reduce((sum, item) => sum + item.count, 0);
|
||||
const sortedByRemainder = [...rawAllocations].sort(
|
||||
(a, b) => b.remainder - a.remainder,
|
||||
);
|
||||
|
||||
for (let index = 0; remaining > 0; index += 1) {
|
||||
sortedByRemainder[index % sortedByRemainder.length].count += 1;
|
||||
remaining -= 1;
|
||||
}
|
||||
|
||||
return rawAllocations.map((item) => {
|
||||
const updated = sortedByRemainder.find(
|
||||
(allocation) => allocation.kota === item.kota,
|
||||
);
|
||||
|
||||
return {
|
||||
...item,
|
||||
count: updated.count,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
function csvEscape(value) {
|
||||
if (value === null || value === undefined) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const stringValue = String(value);
|
||||
|
||||
if (
|
||||
stringValue.includes(',') ||
|
||||
stringValue.includes('"') ||
|
||||
stringValue.includes('\n')
|
||||
) {
|
||||
return `"${stringValue.replace(/"/g, '""')}"`;
|
||||
}
|
||||
|
||||
return stringValue;
|
||||
}
|
||||
|
||||
function makeCoordinates(city) {
|
||||
const latJitter = (random() - 0.5) * 0.16;
|
||||
const lngJitter = (random() - 0.5) * 0.16;
|
||||
|
||||
return {
|
||||
latitude: (city.lat + latJitter).toFixed(6),
|
||||
longitude: (city.lng + lngJitter).toFixed(6),
|
||||
};
|
||||
}
|
||||
|
||||
function makePhone(prefix) {
|
||||
const suffix = String(Math.floor(1000000 + random() * 8999999));
|
||||
return `${prefix}${suffix}`;
|
||||
}
|
||||
|
||||
function makeRating() {
|
||||
return (3.8 + random() * 1.1).toFixed(1);
|
||||
}
|
||||
|
||||
function makeReviewCount(category) {
|
||||
const highTrafficCategories = new Set([
|
||||
'Restoran',
|
||||
'Cafe',
|
||||
'Mall',
|
||||
'Wisata',
|
||||
'Hotel',
|
||||
'Rumah Sakit',
|
||||
]);
|
||||
const max = highTrafficCategories.has(category) ? 6000 : 1500;
|
||||
const min = highTrafficCategories.has(category) ? 80 : 10;
|
||||
|
||||
return Math.floor(min + random() * max);
|
||||
}
|
||||
|
||||
function resolveCity(cityTarget, rowOffset) {
|
||||
if (cityTarget.kota !== 'Kota lain') {
|
||||
return cityTarget;
|
||||
}
|
||||
|
||||
return OTHER_CITIES[rowOffset % OTHER_CITIES.length];
|
||||
}
|
||||
|
||||
function makePlaceRow(id, cityTarget, rowOffset) {
|
||||
const city = resolveCity(cityTarget, rowOffset);
|
||||
const category = weightedPick(CATEGORY_DEFINITIONS);
|
||||
const district = pick(city.districts);
|
||||
const street = pick(STREET_NAMES);
|
||||
const streetNumber = Math.floor(1 + random() * 299);
|
||||
const coords = makeCoordinates(city);
|
||||
const name = `${pick(category.prefixes)} ${pick(category.nouns)} ${city.kota}`;
|
||||
|
||||
return [
|
||||
id,
|
||||
name,
|
||||
category.kategori,
|
||||
pick(category.subcategories),
|
||||
`${street} No ${streetNumber}`,
|
||||
district,
|
||||
city.kota,
|
||||
city.provinsi,
|
||||
coords.latitude,
|
||||
coords.longitude,
|
||||
makePhone(city.phonePrefix),
|
||||
pick(category.openingHours),
|
||||
makeRating(),
|
||||
makeReviewCount(category.kategori),
|
||||
'GeoSeekSynthetic',
|
||||
'unverified',
|
||||
];
|
||||
}
|
||||
|
||||
async function writeLine(stream, values) {
|
||||
const line = `${values.map(csvEscape).join(',')}\n`;
|
||||
|
||||
if (!stream.write(line)) {
|
||||
await once(stream, 'drain');
|
||||
}
|
||||
}
|
||||
|
||||
async function generateCsv({ rows, output }) {
|
||||
if (!Number.isInteger(rows) || rows < 1) {
|
||||
throw new Error('--rows must be a positive integer');
|
||||
}
|
||||
|
||||
fs.mkdirSync(path.dirname(output), { recursive: true });
|
||||
|
||||
const allocations = allocateCounts(rows, CITY_TARGETS);
|
||||
const stream = fs.createWriteStream(output, { encoding: 'utf8' });
|
||||
let id = 1;
|
||||
|
||||
await writeLine(stream, HEADER);
|
||||
|
||||
for (const cityAllocation of allocations) {
|
||||
for (let index = 0; index < cityAllocation.count; index += 1) {
|
||||
await writeLine(stream, makePlaceRow(id, cityAllocation, index));
|
||||
id += 1;
|
||||
}
|
||||
}
|
||||
|
||||
stream.end();
|
||||
await once(stream, 'finish');
|
||||
|
||||
return {
|
||||
output,
|
||||
rows: id - 1,
|
||||
rawCityTargetTotal: CITY_TARGETS.reduce((sum, item) => sum + item.target, 0),
|
||||
};
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const args = parseArgs(process.argv);
|
||||
|
||||
if (args.help) {
|
||||
printHelp();
|
||||
return;
|
||||
}
|
||||
|
||||
const result = await generateCsv(args);
|
||||
console.log(
|
||||
`Generated ${result.rows.toLocaleString('id-ID')} rows: ${path.relative(
|
||||
WORKSPACE_ROOT,
|
||||
result.output,
|
||||
)}`,
|
||||
);
|
||||
console.log(
|
||||
`Raw city target total is ${result.rawCityTargetTotal.toLocaleString(
|
||||
'id-ID',
|
||||
)}; allocations were scaled to requested row count.`,
|
||||
);
|
||||
}
|
||||
|
||||
if (require.main === module) {
|
||||
main().catch((error) => {
|
||||
console.error(error);
|
||||
process.exitCode = 1;
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
allocateCounts,
|
||||
generateCsv,
|
||||
resolveWorkspacePath,
|
||||
};
|
||||
46
data/geoseek/README.md
Normal file
46
data/geoseek/README.md
Normal file
@ -0,0 +1,46 @@
|
||||
# GeoSeek Dataset Nasional
|
||||
|
||||
Folder ini adalah pondasi dataset GeoSeek untuk target **CSV 1.000.000 baris** dan import database skala nasional.
|
||||
|
||||
## File
|
||||
|
||||
- `geo_places_template.csv` — header CSV standar.
|
||||
- `geo_places_sample.csv` — data awal realistis kota besar Indonesia untuk demo/dev.
|
||||
- `geo_categories.csv` — kategori utama dan target distribusi kategori.
|
||||
- `geo_city_targets.csv` — target distribusi kota dari blueprint GeoSeek.
|
||||
- `geo_api_schema.json` — draft schema response API pencarian.
|
||||
- `geo_database.sql` — draft schema SQL mandiri untuk GeoSeek.
|
||||
|
||||
## Struktur CSV utama
|
||||
|
||||
```csv
|
||||
id,nama_tempat,kategori,subkategori,alamat,kecamatan,kota,provinsi,latitude,longitude,no_telp,jam_operasional,rating,jumlah_review,sumber_data,status_verifikasi
|
||||
```
|
||||
|
||||
## Generate CSV 1 juta baris
|
||||
|
||||
Script generator ada di:
|
||||
|
||||
```txt
|
||||
backend/src/scripts/geoseek/generateGeoPlacesCsv.js
|
||||
```
|
||||
|
||||
Contoh membuat 10.000 baris untuk uji cepat:
|
||||
|
||||
```bash
|
||||
node backend/src/scripts/geoseek/generateGeoPlacesCsv.js --rows=10000 --output=data/geoseek/generated/geo_places_10k.csv
|
||||
```
|
||||
|
||||
Contoh membuat 1.000.000 baris:
|
||||
|
||||
```bash
|
||||
node backend/src/scripts/geoseek/generateGeoPlacesCsv.js --rows=1000000 --output=data/geoseek/generated/geo_places_1M.csv
|
||||
```
|
||||
|
||||
> Catatan: target kota pada blueprint berjumlah 1.030.000 jika dijumlah mentah. Generator otomatis melakukan scaling proporsional agar hasil tepat sesuai `--rows`, misalnya tepat 1.000.000 baris.
|
||||
|
||||
## Status data
|
||||
|
||||
- `geo_places_sample.csv` adalah seed awal untuk development/demo dan masih perlu verifikasi sebelum dianggap data produksi.
|
||||
- CSV hasil generator memakai `sumber_data=GeoSeekSynthetic` dan `status_verifikasi=unverified`, karena data dibuat sintetis untuk load test, demo, dan pengembangan ranking/search.
|
||||
- Untuk produksi, gabungkan dengan sumber legal seperti data internal, data publik resmi, atau OpenStreetMap/penyedia POI lain dengan kolom sumber dan lisensi yang jelas.
|
||||
1000001
data/geoseek/generated/geo_places_1M.csv
Normal file
1000001
data/geoseek/generated/geo_places_1M.csv
Normal file
File diff suppressed because it is too large
Load Diff
43
data/geoseek/geo_api_schema.json
Normal file
43
data/geoseek/geo_api_schema.json
Normal file
@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "GeoSeek Search API Schema",
|
||||
"version": "1.0.0",
|
||||
"description": "Schema respons pencarian GeoSeek berbasis dataset CSV Nasional.",
|
||||
"endpoint": "GET /api/geoseek/search",
|
||||
"query": {
|
||||
"q": "string, kata kunci seperti restoran/cafe/apotek",
|
||||
"lat": "number, opsional latitude user",
|
||||
"lng": "number, opsional longitude user",
|
||||
"kota": "string, opsional filter kota",
|
||||
"provinsi": "string, opsional filter provinsi",
|
||||
"kategori": "string, opsional filter kategori",
|
||||
"radius_km": "number, opsional radius pencarian"
|
||||
},
|
||||
"response": {
|
||||
"rows": [
|
||||
{
|
||||
"id": "number|string",
|
||||
"nama_tempat": "string",
|
||||
"kategori": "string",
|
||||
"subkategori": "string",
|
||||
"alamat": "string",
|
||||
"kecamatan": "string",
|
||||
"kota": "string",
|
||||
"provinsi": "string",
|
||||
"latitude": "number",
|
||||
"longitude": "number",
|
||||
"distance_meters": "number|null",
|
||||
"rating": "number|null",
|
||||
"jumlah_review": "number|null",
|
||||
"no_telp": "string|null",
|
||||
"jam_operasional": "string|null",
|
||||
"sumber_data": "string",
|
||||
"status_verifikasi": "verified|unverified|synthetic"
|
||||
}
|
||||
],
|
||||
"count": "number",
|
||||
"meta": {
|
||||
"q": "string",
|
||||
"geo_score_formula": "distance 40%, rating 25%, popularity 20%, freshness 10%, relevance 5%"
|
||||
}
|
||||
}
|
||||
}
|
||||
36
data/geoseek/geo_categories.csv
Normal file
36
data/geoseek/geo_categories.csv
Normal file
@ -0,0 +1,36 @@
|
||||
id,kategori,subkategori_default,target_total
|
||||
1,Restoran,Makanan Lokal,150000
|
||||
2,Cafe,Coffee Shop,50000
|
||||
3,Hotel,Hotel/Penginapan,40000
|
||||
4,Rumah Sakit,Rumah Sakit Umum,25000
|
||||
5,Apotek,Apotek Umum,50000
|
||||
6,ATM,ATM Bank,25000
|
||||
7,SPBU,Pom Bensin,15000
|
||||
8,Bengkel,Bengkel Motor/Mobil,50000
|
||||
9,Wisata,Tempat Wisata,50000
|
||||
10,Mall,Pusat Perbelanjaan,30000
|
||||
11,Minimarket,Toko Harian,30000
|
||||
12,Klinik,Klinik Umum,15000
|
||||
13,Dokter,Praktik Dokter,15000
|
||||
14,Laundry,Laundry Kiloan,40000
|
||||
15,Bank,Kantor Bank,15000
|
||||
16,Sekolah,Sekolah Dasar/Menengah,50000
|
||||
17,Kampus,Perguruan Tinggi,30000
|
||||
18,Masjid,Tempat Ibadah Islam,110000
|
||||
19,Gereja,Tempat Ibadah Kristen/Katolik,40000
|
||||
20,Penginapan,Guest House/Homestay,25000
|
||||
21,Kost,Rumah Kost,30000
|
||||
22,Pasar,Pasar Tradisional,25000
|
||||
23,Rental Mobil,Sewa Mobil,15000
|
||||
24,Rental Motor,Sewa Motor,10000
|
||||
25,Salon,Salon Kecantikan,20000
|
||||
26,Barbershop,Pangkas Rambut,20000
|
||||
27,Gym,Pusat Kebugaran,15000
|
||||
28,Kolam Renang,Fasilitas Olahraga Air,10000
|
||||
29,Toko Bangunan,Material Bangunan,40000
|
||||
30,Toko Elektronik,Elektronik & Gadget,35000
|
||||
31,Toko Pakaian,Fashion,35000
|
||||
32,Logistik,Jasa Pengiriman,20000
|
||||
33,Kurir,Jasa Kurir Lokal,10000
|
||||
34,Jasa,Layanan Umum,30000
|
||||
35,UMKM,Usaha Mikro Kecil Menengah,75000
|
||||
|
16
data/geoseek/geo_city_targets.csv
Normal file
16
data/geoseek/geo_city_targets.csv
Normal file
@ -0,0 +1,16 @@
|
||||
id,kota,provinsi,target_data,latitude,longitude
|
||||
1,Jakarta,DKI Jakarta,200000,-6.2000,106.8167
|
||||
2,Surabaya,Jawa Timur,100000,-7.2575,112.7521
|
||||
3,Bandung,Jawa Barat,90000,-6.9175,107.6191
|
||||
4,Medan,Sumatera Utara,80000,3.5952,98.6722
|
||||
5,Bekasi,Jawa Barat,70000,-6.2383,106.9756
|
||||
6,Tangerang,Banten,70000,-6.1783,106.6319
|
||||
7,Semarang,Jawa Tengah,60000,-6.9667,110.4167
|
||||
8,Makassar,Sulawesi Selatan,50000,-5.1477,119.4327
|
||||
9,Palembang,Sumatera Selatan,45000,-2.9761,104.7754
|
||||
10,Depok,Jawa Barat,45000,-6.4025,106.7942
|
||||
11,Bogor,Jawa Barat,40000,-6.5971,106.8060
|
||||
12,Yogyakarta,DI Yogyakarta,35000,-7.7956,110.3695
|
||||
13,Denpasar,Bali,30000,-8.6705,115.2126
|
||||
14,Malang,Jawa Timur,30000,-7.9666,112.6326
|
||||
15,Kota lain,Nasional,85000,-2.5489,118.0149
|
||||
|
65
data/geoseek/geo_database.sql
Normal file
65
data/geoseek/geo_database.sql
Normal file
@ -0,0 +1,65 @@
|
||||
-- GeoSeek database draft for PostgreSQL.
|
||||
-- This file is intentionally schema-only; do not run on production before adapting migrations.
|
||||
|
||||
CREATE TABLE IF NOT EXISTS geo_categories (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
kategori TEXT NOT NULL UNIQUE,
|
||||
subkategori_default TEXT,
|
||||
target_total INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS geo_regions (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
provinsi TEXT NOT NULL,
|
||||
kota TEXT NOT NULL,
|
||||
kecamatan TEXT,
|
||||
kelurahan TEXT,
|
||||
latitude NUMERIC(10, 7),
|
||||
longitude NUMERIC(10, 7),
|
||||
sumber_data TEXT DEFAULT 'GeoSeek',
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS geo_places (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
nama_tempat TEXT NOT NULL,
|
||||
kategori TEXT NOT NULL,
|
||||
subkategori TEXT,
|
||||
alamat TEXT,
|
||||
kecamatan TEXT,
|
||||
kota TEXT,
|
||||
provinsi TEXT,
|
||||
latitude NUMERIC(10, 7),
|
||||
longitude NUMERIC(10, 7),
|
||||
no_telp TEXT,
|
||||
jam_operasional TEXT,
|
||||
rating NUMERIC(2, 1),
|
||||
jumlah_review INTEGER DEFAULT 0,
|
||||
sumber_data TEXT NOT NULL DEFAULT 'GeoSeek',
|
||||
status_verifikasi TEXT NOT NULL DEFAULT 'unverified',
|
||||
status TEXT NOT NULL DEFAULT 'aktif',
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_geo_places_keyword
|
||||
ON geo_places USING GIN (to_tsvector('simple', coalesce(nama_tempat, '') || ' ' || coalesce(kategori, '') || ' ' || coalesce(subkategori, '') || ' ' || coalesce(alamat, '')));
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_geo_places_location
|
||||
ON geo_places (latitude, longitude);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_geo_places_region
|
||||
ON geo_places (provinsi, kota, kecamatan);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS geo_reviews (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
place_id BIGINT NOT NULL REFERENCES geo_places(id) ON DELETE CASCADE,
|
||||
user_id UUID,
|
||||
rating NUMERIC(2, 1),
|
||||
comment TEXT,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
81
data/geoseek/geo_places_sample.csv
Normal file
81
data/geoseek/geo_places_sample.csv
Normal file
@ -0,0 +1,81 @@
|
||||
id,nama_tempat,kategori,subkategori,alamat,kecamatan,kota,provinsi,latitude,longitude,no_telp,jam_operasional,rating,jumlah_review,sumber_data,status_verifikasi
|
||||
1,Warung Nasi Sunda Ibu Ani,Restoran,Makanan Sunda,Jl Asia Afrika No 20,Sumur Bandung,Bandung,Jawa Barat,-6.9218,107.6072,022xxxxxxx,07:00-22:00,4.6,850,GeoSeek,verified
|
||||
2,Hotel Indonesia Kempinski,Hotel,Hotel Bintang 5,Jl MH Thamrin No 1,Menteng,Jakarta Pusat,DKI Jakarta,-6.1939,106.8230,021xxxxxxx,24 Jam,4.8,5200,GeoSeek,verified
|
||||
3,Rumah Sakit Cipto Mangunkusumo,Rumah Sakit,Rumah Sakit Umum,Jl Diponegoro No 71,Senen,Jakarta Pusat,DKI Jakarta,-6.1975,106.8447,021xxxxxxx,24 Jam,4.5,3200,GeoSeek,verified
|
||||
4,SPBU Pertamina Sudirman,SPBU,Pom Bensin,Jl Sudirman,Karet Tengsin,Jakarta Pusat,DKI Jakarta,-6.2088,106.8220,021xxxxxxx,24 Jam,4.4,900,GeoSeek,verified
|
||||
5,Masjid Raya Bandung,Masjid,Masjid Raya,Alun-Alun Bandung,Regol,Bandung,Jawa Barat,-6.9219,107.6070,,24 Jam,4.8,7000,GeoSeek,verified
|
||||
6,Cafe Braga Senja,Cafe,Coffee Shop,Jl Braga No 45,Sumur Bandung,Bandung,Jawa Barat,-6.9179,107.6099,022xxxxxxx,08:00-23:00,4.5,1180,GeoSeek,verified
|
||||
7,Apotek Merdeka Bandung,Apotek,Apotek Umum,Jl Merdeka No 10,Bandung Wetan,Bandung,Jawa Barat,-6.9107,107.6097,022xxxxxxx,08:00-22:00,4.4,420,GeoSeek,verified
|
||||
8,Trans Studio Mall Bandung,Mall,Pusat Perbelanjaan,Jl Gatot Subroto No 289,Batununggal,Bandung,Jawa Barat,-6.9254,107.6366,022xxxxxxx,10:00-22:00,4.6,24500,GeoSeek,verified
|
||||
9,Institut Teknologi Bandung,Kampus,Perguruan Tinggi,Jl Ganesha No 10,Coblong,Bandung,Jawa Barat,-6.8915,107.6107,022xxxxxxx,07:00-18:00,4.8,9800,GeoSeek,verified
|
||||
10,Pasar Baru Trade Center,Pasar,Pusat Grosir,Jl Otto Iskandar Dinata,Kb Jeruk,Bandung,Jawa Barat,-6.9176,107.6042,022xxxxxxx,08:00-17:00,4.3,6400,GeoSeek,verified
|
||||
11,Monumen Nasional,Wisata,Monumen,Jl Medan Merdeka Gambir,Gambir,Jakarta Pusat,DKI Jakarta,-6.1754,106.8272,021xxxxxxx,08:00-16:00,4.7,72000,GeoSeek,verified
|
||||
12,Grand Indonesia,Mall,Pusat Perbelanjaan,Jl MH Thamrin No 1,Menteng,Jakarta Pusat,DKI Jakarta,-6.1951,106.8205,021xxxxxxx,10:00-22:00,4.7,58000,GeoSeek,verified
|
||||
13,Stasiun Gambir,Logistik,Transportasi Publik,Jl Medan Merdeka Timur,Gambir,Jakarta Pusat,DKI Jakarta,-6.1766,106.8307,021xxxxxxx,24 Jam,4.5,36000,GeoSeek,verified
|
||||
14,Plaza Senayan,Mall,Pusat Perbelanjaan,Jl Asia Afrika No 8,Tanah Abang,Jakarta Pusat,DKI Jakarta,-6.2256,106.7993,021xxxxxxx,10:00-22:00,4.6,31000,GeoSeek,verified
|
||||
15,Pasar Tanah Abang,Pasar,Pasar Grosir,Jl KH Mas Mansyur,Tanah Abang,Jakarta Pusat,DKI Jakarta,-6.1889,106.8106,021xxxxxxx,08:00-16:00,4.3,42000,GeoSeek,verified
|
||||
16,Kota Tua Jakarta,Wisata,Kawasan Sejarah,Jl Taman Fatahillah,Taman Sari,Jakarta Barat,DKI Jakarta,-6.1352,106.8133,021xxxxxxx,08:00-22:00,4.6,65000,GeoSeek,verified
|
||||
17,Universitas Indonesia,Kampus,Perguruan Tinggi,Jl Margonda Raya,Beji,Depok,Jawa Barat,-6.3600,106.8272,021xxxxxxx,07:00-18:00,4.7,18500,GeoSeek,verified
|
||||
18,RS Universitas Indonesia,Rumah Sakit,Rumah Sakit Pendidikan,Jl Prof Dr Bahder Djohan,Beji,Depok,Jawa Barat,-6.3685,106.8294,021xxxxxxx,24 Jam,4.4,2100,GeoSeek,verified
|
||||
19,Margocity Mall,Mall,Pusat Perbelanjaan,Jl Margonda Raya No 358,Beji,Depok,Jawa Barat,-6.3735,106.8344,021xxxxxxx,10:00-22:00,4.6,27000,GeoSeek,verified
|
||||
20,Kebun Raya Bogor,Wisata,Kebun Raya,Jl Ir H Juanda No 13,Bogor Tengah,Bogor,Jawa Barat,-6.5976,106.7996,0251xxxxxxx,08:00-16:00,4.7,52000,GeoSeek,verified
|
||||
21,RS PMI Bogor,Rumah Sakit,Rumah Sakit Umum,Jl Pajajaran No 80,Bogor Tengah,Bogor,Jawa Barat,-6.5945,106.8068,0251xxxxxxx,24 Jam,4.5,3900,GeoSeek,verified
|
||||
22,Botani Square Mall,Mall,Pusat Perbelanjaan,Jl Raya Pajajaran,Tegallega,Bogor,Jawa Barat,-6.6002,106.8060,0251xxxxxxx,10:00-22:00,4.5,21000,GeoSeek,verified
|
||||
23,Tugu Pahlawan Surabaya,Wisata,Monumen,Jl Pahlawan, Bubutan,Surabaya,Jawa Timur,-7.2458,112.7378,031xxxxxxx,08:00-16:00,4.6,18000,GeoSeek,verified
|
||||
24,RSUD Dr Soetomo,Rumah Sakit,Rumah Sakit Umum,Jl Mayjen Prof Dr Moestopo,Gubeng,Surabaya,Jawa Timur,-7.2677,112.7580,031xxxxxxx,24 Jam,4.5,8600,GeoSeek,verified
|
||||
25,Tunjungan Plaza,Mall,Pusat Perbelanjaan,Jl Basuki Rahmat,Tegalsari,Surabaya,Jawa Timur,-7.2633,112.7406,031xxxxxxx,10:00-22:00,4.7,65000,GeoSeek,verified
|
||||
26,Warung Rawon Setan,Restoran,Rawon,Jl Embong Malang,Genteng,Surabaya,Jawa Timur,-7.2607,112.7387,031xxxxxxx,08:00-23:00,4.4,7200,GeoSeek,verified
|
||||
27,Jembatan Suramadu,Wisata,Ikon Kota,Kenjeran,Kenjeran,Surabaya,Jawa Timur,-7.1824,112.7787,,24 Jam,4.6,33000,GeoSeek,verified
|
||||
28,Universitas Airlangga,Kampus,Perguruan Tinggi,Jl Airlangga No 4,Gubeng,Surabaya,Jawa Timur,-7.2692,112.7593,031xxxxxxx,07:00-18:00,4.7,9800,GeoSeek,verified
|
||||
29,Hotel Majapahit Surabaya,Hotel,Hotel Heritage,Jl Tunjungan No 65,Genteng,Surabaya,Jawa Timur,-7.2592,112.7399,031xxxxxxx,24 Jam,4.7,9200,GeoSeek,verified
|
||||
30,Lawang Sewu,Wisata,Bangunan Bersejarah,Jl Pemuda,Sekayu,Semarang,Jawa Tengah,-6.9840,110.4108,024xxxxxxx,08:00-20:00,4.6,56000,GeoSeek,verified
|
||||
31,Simpang Lima Semarang,Wisata,Ruang Publik,Jl Simpang Lima,Pleburan,Semarang,Jawa Tengah,-6.9904,110.4229,,24 Jam,4.6,36000,GeoSeek,verified
|
||||
32,RSUP Dr Kariadi,Rumah Sakit,Rumah Sakit Umum,Jl Dr Sutomo,Randusaharjo,Semarang,Jawa Tengah,-6.9932,110.4076,024xxxxxxx,24 Jam,4.5,7600,GeoSeek,verified
|
||||
33,Paragon City Mall Semarang,Mall,Pusat Perbelanjaan,Jl Pemuda No 118,Sekayu,Semarang,Jawa Tengah,-6.9808,110.4149,024xxxxxxx,10:00-22:00,4.6,28000,GeoSeek,verified
|
||||
34,Universitas Diponegoro,Kampus,Perguruan Tinggi,Jl Prof Soedarto,Tembalang,Semarang,Jawa Tengah,-7.0506,110.4401,024xxxxxxx,07:00-18:00,4.7,12800,GeoSeek,verified
|
||||
35,Malioboro Yogyakarta,Wisata,Kawasan Belanja,Jl Malioboro,Gedongtengen,Yogyakarta,DI Yogyakarta,-7.7926,110.3658,,24 Jam,4.7,89000,GeoSeek,verified
|
||||
36,Keraton Yogyakarta,Wisata,Budaya,Jl Rotowijayan,Krton,Yogyakarta,DI Yogyakarta,-7.8053,110.3642,0274xxxxxxx,08:00-14:00,4.6,34000,GeoSeek,verified
|
||||
37,Universitas Gadjah Mada,Kampus,Perguruan Tinggi,Jl Bulaksumur,Depok,Sleman,DI Yogyakarta,-7.7707,110.3776,0274xxxxxxx,07:00-18:00,4.8,24000,GeoSeek,verified
|
||||
38,Pasar Beringharjo,Pasar,Pasar Tradisional,Jl Margo Mulyo,Gondomanan,Yogyakarta,DI Yogyakarta,-7.7986,110.3671,0274xxxxxxx,08:00-17:00,4.5,32000,GeoSeek,verified
|
||||
39,RSUP Dr Sardjito,Rumah Sakit,Rumah Sakit Umum,Jl Kesehatan No 1,Mlati,Sleman,DI Yogyakarta,-7.7683,110.3738,0274xxxxxxx,24 Jam,4.5,7100,GeoSeek,verified
|
||||
40,Maimun Palace,Wisata,Istana,Jl Brigjen Katamso,Aur,Medan,Sumatera Utara,3.5753,98.6830,061xxxxxxx,08:00-17:00,4.5,26000,GeoSeek,verified
|
||||
41,Masjid Raya Al Mashun,Masjid,Masjid Raya,Jl Sisingamangaraja,Matsum,Medan,Sumatera Utara,3.5757,98.6873,,24 Jam,4.8,30000,GeoSeek,verified
|
||||
42,Sun Plaza Medan,Mall,Pusat Perbelanjaan,Jl KH Zainul Arifin,Madras Hulu,Medan,Sumatera Utara,3.5838,98.6728,061xxxxxxx,10:00-22:00,4.6,29000,GeoSeek,verified
|
||||
43,RSUP H Adam Malik,Rumah Sakit,Rumah Sakit Umum,Jl Bunga Lau,Tuntungan,Medan,Sumatera Utara,3.5196,98.6080,061xxxxxxx,24 Jam,4.4,6000,GeoSeek,verified
|
||||
44,Kedai Kopi Medan Baru,Cafe,Kedai Kopi,Jl Abdullah Lubis,Medan Baru,Medan,Sumatera Utara,3.5856,98.6649,061xxxxxxx,07:00-23:00,4.5,2400,GeoSeek,verified
|
||||
45,Benteng Rotterdam,Wisata,Benteng Sejarah,Jl Ujung Pandang,Bulo Gading,Makassar,Sulawesi Selatan,-5.1340,119.4054,0411xxxxxxx,08:00-18:00,4.6,22000,GeoSeek,verified
|
||||
46,Pantai Losari,Wisata,Pantai,Jl Penghibur,Losari,Makassar,Sulawesi Selatan,-5.1436,119.4076,,24 Jam,4.6,54000,GeoSeek,verified
|
||||
47,Trans Studio Mall Makassar,Mall,Pusat Perbelanjaan,Jl Metro Tj Bunga,Maccini Sombala,Makassar,Sulawesi Selatan,-5.1570,119.3942,0411xxxxxxx,10:00-22:00,4.6,21000,GeoSeek,verified
|
||||
48,RSUP Dr Wahidin Sudirohusodo,Rumah Sakit,Rumah Sakit Umum,Jl Perintis Kemerdekaan,Tamalanrea,Makassar,Sulawesi Selatan,-5.1350,119.4895,0411xxxxxxx,24 Jam,4.4,5200,GeoSeek,verified
|
||||
49,Universitas Hasanuddin,Kampus,Perguruan Tinggi,Jl Perintis Kemerdekaan,Tamalanrea,Makassar,Sulawesi Selatan,-5.1306,119.4866,0411xxxxxxx,07:00-18:00,4.7,11800,GeoSeek,verified
|
||||
50,Jembatan Ampera,Wisata,Ikon Kota,Jl Lintas Sumatera,Seberang Ulu I,Palembang,Sumatera Selatan,-2.9917,104.7634,,24 Jam,4.7,48000,GeoSeek,verified
|
||||
51,Palembang Icon Mall,Mall,Pusat Perbelanjaan,Jl POM IX,Lorok Pakjo,Palembang,Sumatera Selatan,-2.9768,104.7416,0711xxxxxxx,10:00-22:00,4.6,16000,GeoSeek,verified
|
||||
52,RSUP Dr Mohammad Hoesin,Rumah Sakit,Rumah Sakit Umum,Jl Jenderal Sudirman,Kemuning,Palembang,Sumatera Selatan,-2.9563,104.7480,0711xxxxxxx,24 Jam,4.4,4700,GeoSeek,verified
|
||||
53,Pempek Pak Raden,Restoran,Pempek,Jl Radial,Bukit Kecil,Palembang,Sumatera Selatan,-2.9850,104.7495,0711xxxxxxx,08:00-22:00,4.5,7600,GeoSeek,verified
|
||||
54,Universitas Sriwijaya Kampus Palembang,Kampus,Perguruan Tinggi,Jl Srijaya Negara,Ilir Barat I,Palembang,Sumatera Selatan,-2.9786,104.7334,0711xxxxxxx,07:00-18:00,4.6,6200,GeoSeek,verified
|
||||
55,Bekasi Cyber Park,Mall,Pusat Elektronik,Jl KH Noer Ali,Bekasi Selatan,Bekasi,Jawa Barat,-6.2480,106.9922,021xxxxxxx,10:00-22:00,4.4,18000,GeoSeek,verified
|
||||
56,RSUD Kota Bekasi,Rumah Sakit,Rumah Sakit Umum,Jl Pramuka,Marga Jaya,Bekasi,Jawa Barat,-6.2388,107.0041,021xxxxxxx,24 Jam,4.3,4500,GeoSeek,verified
|
||||
57,Grand Metropolitan Bekasi,Mall,Pusat Perbelanjaan,Jl KH Noer Ali,Pekayon Jaya,Bekasi,Jawa Barat,-6.2554,106.9869,021xxxxxxx,10:00-22:00,4.6,24000,GeoSeek,verified
|
||||
58,Stasiun Bekasi,Logistik,Transportasi Publik,Jl Ir H Juanda,Marga Mulya,Bekasi,Jawa Barat,-6.2366,107.0018,021xxxxxxx,04:00-24:00,4.3,29000,GeoSeek,verified
|
||||
59,IKEA Alam Sutera,Toko & UMKM,Furniture,Jl Jalur Sutera Boulevard,Serpong Utara,Tangerang,Banten,-6.2236,106.6537,021xxxxxxx,10:00-22:00,4.7,55000,GeoSeek,verified
|
||||
60,Summarecon Mall Serpong,Mall,Pusat Perbelanjaan,Jl Boulevard Gading Serpong,Kelapa Dua,Tangerang,Banten,-6.2418,106.6287,021xxxxxxx,10:00-22:00,4.7,42000,GeoSeek,verified
|
||||
61,RS Siloam Lippo Village,Rumah Sakit,Rumah Sakit Umum,Jl Siloam No 6,Kelapa Dua,Tangerang,Banten,-6.2284,106.6037,021xxxxxxx,24 Jam,4.5,7200,GeoSeek,verified
|
||||
62,Bandara Soekarno Hatta,Logistik,Bandara,Jl Bandara Soekarno Hatta,Benda,Tangerang,Banten,-6.1256,106.6559,021xxxxxxx,24 Jam,4.6,98000,GeoSeek,verified
|
||||
63,Pantai Kuta,Wisata,Pantai,Jl Pantai Kuta,Kuta,Denpasar,Bali,-8.7185,115.1686,,24 Jam,4.6,92000,GeoSeek,verified
|
||||
64,Sanur Beach,Wisata,Pantai,Jl Danau Tamblingan,Denpasar Selatan,Denpasar,Bali,-8.6930,115.2625,,24 Jam,4.6,53000,GeoSeek,verified
|
||||
65,RSUP Prof Ngoerah,Rumah Sakit,Rumah Sakit Umum,Jl Diponegoro,Dauh Puri Klod,Denpasar,Bali,-8.6703,115.2125,0361xxxxxxx,24 Jam,4.5,6100,GeoSeek,verified
|
||||
66,Level 21 Mall Denpasar,Mall,Pusat Perbelanjaan,Jl Teuku Umar,Dauh Puri Klod,Denpasar,Bali,-8.6724,115.2111,0361xxxxxxx,10:00-22:00,4.5,17000,GeoSeek,verified
|
||||
67,Universitas Udayana Kampus Sudirman,Kampus,Perguruan Tinggi,Jl PB Sudirman,Dangin Puri Klod,Denpasar,Bali,-8.6713,115.2247,0361xxxxxxx,07:00-18:00,4.6,7800,GeoSeek,verified
|
||||
68,Alun-Alun Kota Malang,Wisata,Ruang Publik,Jl Merdeka Selatan,Klojen,Malang,Jawa Timur,-7.9826,112.6308,,24 Jam,4.6,41000,GeoSeek,verified
|
||||
69,Universitas Brawijaya,Kampus,Perguruan Tinggi,Jl Veteran,Ketawanggede,Malang,Jawa Timur,-7.9525,112.6139,0341xxxxxxx,07:00-18:00,4.7,16500,GeoSeek,verified
|
||||
70,RS Saiful Anwar Malang,Rumah Sakit,Rumah Sakit Umum,Jl Jaksa Agung Suprapto,Klojen,Malang,Jawa Timur,-7.9720,112.6326,0341xxxxxxx,24 Jam,4.4,6200,GeoSeek,verified
|
||||
71,Malang Town Square,Mall,Pusat Perbelanjaan,Jl Veteran,Penanggungan,Malang,Jawa Timur,-7.9558,112.6178,0341xxxxxxx,10:00-22:00,4.5,23000,GeoSeek,verified
|
||||
72,Kampung Warna Warni Jodipan,Wisata,Kampung Tematik,Jodipan,Blimbing,Malang,Jawa Timur,-7.9833,112.6378,,08:00-18:00,4.4,19000,GeoSeek,verified
|
||||
73,Apotek Kimia Farma Thamrin,Apotek,Apotek Umum,Jl MH Thamrin,Menteng,Jakarta Pusat,DKI Jakarta,-6.1906,106.8237,021xxxxxxx,08:00-22:00,4.3,1200,GeoSeek,unverified
|
||||
74,Bengkel Auto Sudirman,Bengkel,Bengkel Mobil,Jl Jenderal Sudirman,Karet Tengsin,Jakarta Pusat,DKI Jakarta,-6.2136,106.8186,021xxxxxxx,08:00-17:00,4.4,640,GeoSeek,unverified
|
||||
75,Laundry Cepat Dago,Laundry,Laundry Kiloan,Jl Ir H Djuanda,Dago,Bandung,Jawa Barat,-6.8844,107.6136,022xxxxxxx,07:00-21:00,4.5,520,GeoSeek,unverified
|
||||
76,Toko Bangunan Maju Jaya,Toko Bangunan,Material Bangunan,Jl Ahmad Yani,Cicadas,Bandung,Jawa Barat,-6.9085,107.6389,022xxxxxxx,08:00-17:00,4.4,760,GeoSeek,unverified
|
||||
77,Toko Elektronik Nusantara,Toko Elektronik,Elektronik & Gadget,Jl Gajah Mada,Glodok,Jakarta Barat,DKI Jakarta,-6.1455,106.8129,021xxxxxxx,09:00-18:00,4.3,2400,GeoSeek,unverified
|
||||
78,Barbershop Urban Cut,Barbershop,Pangkas Rambut,Jl Kemang Raya,Mampang Prapatan,Jakarta Selatan,DKI Jakarta,-6.2607,106.8160,021xxxxxxx,10:00-22:00,4.6,980,GeoSeek,unverified
|
||||
79,Gym Fit Nusantara,Gym,Pusat Kebugaran,Jl HR Rasuna Said,Setiabudi,Jakarta Selatan,DKI Jakarta,-6.2196,106.8324,021xxxxxxx,06:00-22:00,4.5,1500,GeoSeek,unverified
|
||||
80,Kost Nyaman Setiabudi,Kost,Rumah Kost,Jl Setiabudi Tengah,Setiabudi,Jakarta Selatan,DKI Jakarta,-6.2149,106.8298,0812xxxxxxx,08:00-20:00,4.2,210,GeoSeek,unverified
|
||||
|
1
data/geoseek/geo_places_template.csv
Normal file
1
data/geoseek/geo_places_template.csv
Normal file
@ -0,0 +1 @@
|
||||
id,nama_tempat,kategori,subkategori,alamat,kecamatan,kota,provinsi,latitude,longitude,no_telp,jam_operasional,rating,jumlah_review,sumber_data,status_verifikasi
|
||||
|
Loading…
x
Reference in New Issue
Block a user