You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.6 KiB
151 lines
4.6 KiB
6 months ago
|
import React from 'react'
|
||
|
import L from 'leaflet'
|
||
|
import jquery from 'jquery'
|
||
|
|
||
|
import ComponentPopUpPoiGoogle from './ComponentPopUpPoiGoogle'
|
||
|
|
||
|
let latitude
|
||
|
let longitude
|
||
|
|
||
|
function success(position) {
|
||
|
latitude = position.coords.latitude
|
||
|
longitude = position.coords.longitude
|
||
|
}
|
||
|
|
||
|
function error() {
|
||
|
console.log('Unable to retrieve your location')
|
||
|
}
|
||
|
|
||
|
function getLocation() {
|
||
|
navigator.geolocation.getCurrentPosition(success, error)
|
||
|
}
|
||
|
|
||
|
const onClickDirection = (koordinatAwal, KoordinatAkhir) => {
|
||
|
const lat1 = koordinatAwal.lat
|
||
|
const lng1 = koordinatAwal.lng
|
||
|
const lat2 = KoordinatAkhir.lat
|
||
|
const lng2 = KoordinatAkhir.lng
|
||
|
|
||
|
const targetLink = `https://www.google.com/maps/dir/${lat1 ? `${lat1},${lng1}` : ''}/'${lat2},${lng2}'/`
|
||
|
window.open(targetLink, '_blank')
|
||
|
}
|
||
|
|
||
|
L.TileLayer.PoiGoogle = L.TileLayer.WMS.extend({
|
||
|
onAdd(map) {
|
||
|
// Triggered when the layer is added to a map.
|
||
|
// Register a click listener, then do all the upstream WMS things
|
||
|
L.TileLayer.WMS.prototype.onAdd.call(this, map)
|
||
|
map.on('click', this.getFeatureInfo, this)
|
||
|
getLocation()
|
||
|
// map.on('move', () => console.log(this))
|
||
|
// console.log(this)
|
||
|
},
|
||
|
onRemove(map) {
|
||
|
// Triggered when the layer is removed from a map.
|
||
|
// Unregister a click listener, then do all the upstream WMS things
|
||
|
L.TileLayer.WMS.prototype.onRemove.call(this, map)
|
||
|
map.off('click', this.getFeatureInfo, this)
|
||
|
},
|
||
|
async getFeatureInfo(evt) {
|
||
|
// Make an AJAX request to the server and hope for the best
|
||
|
const url = this.getFeatureInfoUrl(evt.latlng),
|
||
|
showResults = L.Util.bind(this.showGetFeatureInfo, this)
|
||
|
|
||
|
await fetch(url)
|
||
|
.then((response) => response.json())
|
||
|
.then((data) => {
|
||
|
// console.log(data)
|
||
|
const err = typeof data === 'object' ? null : data
|
||
|
const numberReturned = data?.numberReturned
|
||
|
|
||
|
if (numberReturned === 1) {
|
||
|
// showResults(err, evt.latlng, JSON.stringify(data))
|
||
|
showResults(err, evt.latlng, data.features[0].properties)
|
||
|
// const id_md = data.features[0].properties.i
|
||
|
}
|
||
|
if (numberReturned > 1) {
|
||
|
showList(err, evt.latlng, data)
|
||
|
}
|
||
|
})
|
||
|
.catch((err) => {
|
||
|
// showResults(JSON.stringify(err))
|
||
|
})
|
||
|
},
|
||
|
|
||
|
getFeatureInfoUrl(latlng) {
|
||
|
// return
|
||
|
// const map = useMap()
|
||
|
// Construct a GetFeatureInfo request URL given a point
|
||
|
const point = this._map.latLngToContainerPoint(latlng)
|
||
|
const size = this._map.getSize()
|
||
|
|
||
|
// https://docs.geoserver.org/latest/en/user/services/wms/reference.html#wms-getfeatureinfo
|
||
|
const params = {
|
||
|
request: 'GetFeatureInfo',
|
||
|
service: 'WMS',
|
||
|
crs: 'EPSG:4326',
|
||
|
styles: this.wmsParams.styles,
|
||
|
transparent: this.wmsParams.transparent,
|
||
|
version: this.wmsParams.version,
|
||
|
format: this.wmsParams.format,
|
||
|
bbox: this._map.getBounds().toBBoxString(),
|
||
|
height: size.y,
|
||
|
// height: this.wmsParams.height,
|
||
|
width: size.x,
|
||
|
// width: this.wmsParams.width,
|
||
|
layers: this.wmsParams.layers,
|
||
|
viewparams: this.wmsParams.viewparams,
|
||
|
cql_filter: this.wmsParams.cql_filter,
|
||
|
query_layers: this.wmsParams.layers,
|
||
|
info_format: 'application/json',
|
||
|
feature_count: 1
|
||
|
}
|
||
|
|
||
|
params[params.version === '1.3.0' ? 'i' : 'x'] = Math.round(point.x)
|
||
|
params[params.version === '1.3.0' ? 'j' : 'y'] = Math.round(point.y)
|
||
|
return this._url + L.Util.getParamString(params, this._url, true)
|
||
|
},
|
||
|
|
||
|
async showGetFeatureInfo(err, latlng, content) {
|
||
|
if (err) {
|
||
|
console.log(err)
|
||
|
}
|
||
|
let data = null
|
||
|
await jquery.ajax({
|
||
|
url: '/engineN/kewilayahan/peta/poigoogle',
|
||
|
type: 'post',
|
||
|
dataType: 'json',
|
||
|
data: { id_data: content.ID_DATA },
|
||
|
success: (response) => {
|
||
|
data = response
|
||
|
// console.log(response)
|
||
|
}
|
||
|
})
|
||
|
const popup = L.popup({ maxWidth: 800, minWidth: 200, namaLayer: this.wmsParams.layers })
|
||
|
.setLatLng(latlng)
|
||
|
.setContent(ComponentPopUpPoiGoogle({ ...content, ...data }))
|
||
|
.openOn(this._map)
|
||
|
|
||
|
const popupTampil = popup._contentNode
|
||
|
const arah = popupTampil.querySelectorAll('.arah')
|
||
|
const poiName = popupTampil.querySelectorAll('.poi-name')
|
||
|
const tutupBox = popupTampil.querySelector('.tutup-box')
|
||
|
|
||
|
tutupBox.addEventListener('click', () => {
|
||
|
popup.close()
|
||
|
})
|
||
|
|
||
|
arah[0].addEventListener('click', () => {
|
||
|
onClickDirection({ lat: latitude ?? '', lng: longitude ?? '' }, { lat: content.GEO_LOK_LAT, lng: content.GEO_LOK_LING })
|
||
|
})
|
||
|
|
||
|
poiName[0].addEventListener('click', () => {
|
||
|
// onClickPoiName(id_md)
|
||
|
})
|
||
|
}
|
||
|
})
|
||
|
|
||
|
L.tileLayer.poiGoogle = function (url, options) {
|
||
|
return new L.TileLayer.PoiGoogle(url, options)
|
||
|
}
|