Adding the ability to click on things.
This commit is contained in:
parent
f3f111060b
commit
064ec75ed3
@ -1,4 +1,6 @@
|
|||||||
import Map from "ol/Map"
|
import Map from "ol/Map"
|
||||||
|
import MapEvent from "ol/MapEvent"
|
||||||
|
import MapBrowserEvent from "ol/MapBrowserEvent"
|
||||||
import View from "ol/View"
|
import View from "ol/View"
|
||||||
import Projection from "ol/proj/Projection.js"
|
import Projection from "ol/proj/Projection.js"
|
||||||
import TileLayer from 'ol/layer/Tile'
|
import TileLayer from 'ol/layer/Tile'
|
||||||
@ -6,7 +8,16 @@ import OSM from 'ol/source/OSM'
|
|||||||
import * as olProj from "ol/proj"
|
import * as olProj from "ol/proj"
|
||||||
import Feature from 'ol/Feature'
|
import Feature from 'ol/Feature'
|
||||||
import Point from 'ol/geom/Point'
|
import Point from 'ol/geom/Point'
|
||||||
|
import VectorLayer from 'ol/layer/Vector'
|
||||||
|
import VectorSource from 'ol/source/Vector'
|
||||||
|
import Stroke from 'ol/style/Stroke'
|
||||||
|
import Fill from 'ol/style/Fill'
|
||||||
|
import CircleStyle from 'ol/style/Circle'
|
||||||
|
import Style from 'ol/style/Style'
|
||||||
|
import BaseEvent from 'ol/events/Event'
|
||||||
|
import {click} from 'ol/events/condition'
|
||||||
|
|
||||||
|
type StylesInterface = Record<string, Style>
|
||||||
export default class Conquer {
|
export default class Conquer {
|
||||||
private conquerContainer: HTMLDivElement
|
private conquerContainer: HTMLDivElement
|
||||||
private map: Map
|
private map: Map
|
||||||
@ -30,6 +41,7 @@ export default class Conquer {
|
|||||||
private conquerRegisterSubmit: HTMLButtonElement
|
private conquerRegisterSubmit: HTMLButtonElement
|
||||||
private conquerRegisterError: HTMLParagraphElement
|
private conquerRegisterError: HTMLParagraphElement
|
||||||
private currentPositionFeature: Feature | null
|
private currentPositionFeature: Feature | null
|
||||||
|
private vectorLayer: VectorLayer<VectorSource> | null = null
|
||||||
private alpha = 0
|
private alpha = 0
|
||||||
private beta = 0
|
private beta = 0
|
||||||
private gamma = 0
|
private gamma = 0
|
||||||
@ -129,7 +141,61 @@ export default class Conquer {
|
|||||||
this.unsetLoginAndRegisterErrors()
|
this.unsetLoginAndRegisterErrors()
|
||||||
const isLogged = await this.isLogged()
|
const isLogged = await this.isLogged()
|
||||||
if (isLogged) {
|
if (isLogged) {
|
||||||
await this.removeLoginRegisterCombo()
|
this.onLoginSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async onLoginSuccess(): Promise<void> {
|
||||||
|
await this.removeLoginRegisterCombo()
|
||||||
|
const currentPositionFeature = this.currentPositionFeature
|
||||||
|
if (currentPositionFeature === null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.map.on('click', (event: MapEvent) => {
|
||||||
|
this.onClickMap(event)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async onClickMap(event: MapEvent): Promise<void> {
|
||||||
|
if (this.vectorLayer === null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!(event instanceof MapBrowserEvent)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (event.dragging) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const pixel = event.pixel
|
||||||
|
const features = this.map.getFeaturesAtPixel(pixel)
|
||||||
|
const feature = features.length ? features[0] : undefined
|
||||||
|
if (feature === undefined) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!(feature instanceof Feature)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.onClickFeature(feature)
|
||||||
|
}
|
||||||
|
|
||||||
|
async onClickSelf(): Promise<void> {
|
||||||
|
alert('Pulsaste en ti mismo')
|
||||||
|
}
|
||||||
|
private isFeatureEnabledMap: Record<string, boolean> = {}
|
||||||
|
|
||||||
|
async onClickFeature(feature: Feature): Promise<void> {
|
||||||
|
if (this.isFeatureEnabledMap[feature.getProperties().type] === undefined) {
|
||||||
|
this.isFeatureEnabledMap[feature.getProperties().type] = true
|
||||||
|
}
|
||||||
|
if (!this.isFeatureEnabledMap[feature.getProperties().type]) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.isFeatureEnabledMap[feature.getProperties().type] = false
|
||||||
|
window.setTimeout(() => {
|
||||||
|
this.isFeatureEnabledMap[feature.getProperties().type] = true
|
||||||
|
}, 100);
|
||||||
|
if (feature === this.currentPositionFeature) {
|
||||||
|
this.onClickSelf()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,13 +318,19 @@ export default class Conquer {
|
|||||||
this.conquerRegisterError.innerText = error
|
this.conquerRegisterError.innerText = error
|
||||||
this.conquerRegisterError.classList.remove('conquer-display-none')
|
this.conquerRegisterError.classList.remove('conquer-display-none')
|
||||||
}
|
}
|
||||||
async run() {
|
|
||||||
this.fillConquerLogin()
|
async checkLogin(): Promise<void> {
|
||||||
this.fillConquerRegister()
|
|
||||||
const isLogged = await this.isLogged()
|
const isLogged = await this.isLogged()
|
||||||
if (!isLogged) {
|
if (!isLogged) {
|
||||||
this.conquerLogin.classList.remove('conquer-display-none')
|
this.conquerLogin.classList.remove('conquer-display-none')
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
this.onLoginSuccess()
|
||||||
|
}
|
||||||
|
async run() {
|
||||||
|
this.fillConquerLogin()
|
||||||
|
this.fillConquerRegister()
|
||||||
|
this.checkLogin()
|
||||||
const conquerContainer = this.conquerContainer
|
const conquerContainer = this.conquerContainer
|
||||||
//layer.on('prerender', (evt) => {
|
//layer.on('prerender', (evt) => {
|
||||||
// // return
|
// // return
|
||||||
@ -302,6 +374,15 @@ export default class Conquer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addCurrentLocationMarkerToMap(currentLatitude: number,
|
||||||
|
currentLongitude: number) {
|
||||||
|
const currentPositionFeature = new Feature({
|
||||||
|
type: 'currentPositionFeature',
|
||||||
|
geometry: new Point(this.realCoordinatesToOl(currentLatitude, currentLongitude))
|
||||||
|
})
|
||||||
|
this.currentPositionFeature = currentPositionFeature
|
||||||
|
}
|
||||||
|
|
||||||
processLocation(location: GeolocationPosition) {
|
processLocation(location: GeolocationPosition) {
|
||||||
this.currentLatitude = location.coords.latitude
|
this.currentLatitude = location.coords.latitude
|
||||||
this.currentLongitude = location. coords.longitude
|
this.currentLongitude = location. coords.longitude
|
||||||
@ -309,13 +390,44 @@ export default class Conquer {
|
|||||||
this.disableSetRotationOffset = true
|
this.disableSetRotationOffset = true
|
||||||
this.heading = location.coords.heading
|
this.heading = location.coords.heading
|
||||||
this.rotationOffset = this.compassHeading(this.alpha, this.beta, this.gamma) + (location.coords.heading*Math.PI*2)/360
|
this.rotationOffset = this.compassHeading(this.alpha, this.beta, this.gamma) + (location.coords.heading*Math.PI*2)/360
|
||||||
this.setCenterDisplaced(this.currentLatitude, this.currentLongitude)
|
|
||||||
const currentPositionFeature = new Feature({
|
|
||||||
type: 'currentPositionFeature',
|
|
||||||
geometry: new Point([this.currentLatitude, this.currentLongitude])
|
|
||||||
})
|
|
||||||
this.currentPositionFeature = currentPositionFeature
|
|
||||||
}
|
}
|
||||||
|
this.setCenterDisplaced(this.currentLatitude, this.currentLongitude)
|
||||||
|
this.addCurrentLocationMarkerToMap(this.currentLatitude, this.currentLongitude)
|
||||||
|
this.refreshLayers()
|
||||||
|
}
|
||||||
|
|
||||||
|
private refreshLayers(): void {
|
||||||
|
if (this.currentPositionFeature === null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const styles: StylesInterface = {
|
||||||
|
currentPositionFeature: new Style({
|
||||||
|
image: new CircleStyle({
|
||||||
|
radius: 14,
|
||||||
|
fill: new Fill({color: 'white'}),
|
||||||
|
stroke: new Stroke({
|
||||||
|
color: 'blue',
|
||||||
|
width: 2,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
};
|
||||||
|
const vectorLayer = new VectorLayer<VectorSource>({
|
||||||
|
source: new VectorSource({
|
||||||
|
features: [this.currentPositionFeature]
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
if (this.vectorLayer !== null) {
|
||||||
|
this.map.removeLayer(this.vectorLayer)
|
||||||
|
}
|
||||||
|
vectorLayer.setStyle((feature) => {
|
||||||
|
return styles[feature.getProperties().type]
|
||||||
|
})
|
||||||
|
this.map.addLayer(vectorLayer)
|
||||||
|
this.vectorLayer = vectorLayer
|
||||||
|
this.map.on('click', (event: MapEvent) => {
|
||||||
|
this.onClickMap(event)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
setLocationChangeTriggers(): void {
|
setLocationChangeTriggers(): void {
|
||||||
window.setInterval(() => {
|
window.setInterval(() => {
|
||||||
@ -330,18 +442,20 @@ export default class Conquer {
|
|||||||
return
|
return
|
||||||
}, {
|
}, {
|
||||||
enableHighAccuracy: true,
|
enableHighAccuracy: true,
|
||||||
maximumAge: 0
|
|
||||||
})
|
})
|
||||||
}, 1000)
|
}, 3000)
|
||||||
}, 1000)
|
}, 1000)
|
||||||
this.setCenterDisplaced(37.58237, -5.96766)
|
const initialLatitude = 37.58237
|
||||||
|
const initialLongitude = -5.96766
|
||||||
|
this.setCenterDisplaced(initialLatitude, initialLongitude)
|
||||||
|
this.addCurrentLocationMarkerToMap(initialLatitude, initialLongitude)
|
||||||
|
this.refreshLayers()
|
||||||
navigator.geolocation.watchPosition((location) => {
|
navigator.geolocation.watchPosition((location) => {
|
||||||
this.processLocation(location)
|
this.processLocation(location)
|
||||||
}, (err) => {
|
}, (err) => {
|
||||||
return
|
return
|
||||||
}, {
|
}, {
|
||||||
enableHighAccuracy: true,
|
enableHighAccuracy: true,
|
||||||
maximumAge: 0
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
realCoordinatesToOl(lat: number, lon: number): number[] {
|
realCoordinatesToOl(lat: number, lon: number): number[] {
|
||||||
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user