2024-10-17 15:01:47 +02:00
//import * as geoDataPointsFromApi from './data.json';
const overrideQuery = true
2024-11-26 21:31:43 +01:00
const initialZoom = 12
2024-10-17 15:01:47 +02:00
const osmMention = '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors'
2024-11-26 21:31:43 +01:00
let unknown _color = '#c0b1b1' // color for unknown power output of the station
2024-10-17 15:01:47 +02:00
// serveurs de tuiles: https://wiki.openstreetmap.org/wiki/Tile_servers
// https://stamen-tiles.a.ssl.fastly.net/toner/{z}/{x}/{y}.png
// https://a.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png
2024-10-18 00:47:01 +02:00
// https://tile.openstreetmap.org/{z}/{x}/{y}.png
// 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png'
2024-10-17 15:01:47 +02:00
const tileServer = 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png'
// Créer la carte centrée sur Rouen
var map = L . map ( 'map' ) . setView ( [ 49.4438 , 1.0993 ] , initialZoom )
// 'https://overpass-api.de/api/interpreter?data=[out:json][timeout:25];' +
// 'area(id:3600075628)->.searchArea;' +
// 'node[amenity=charging_station](area.searchArea);' +
// 'out body geom;'
L . tileLayer ( tileServer , {
maxZoom : 19 ,
attribution : osmMention ,
} ) . addTo ( map )
// if (overrideQuery) {
// $('#overpass-api-controls').hide();
// }
function buildOverpassApiUrl ( map , overpassQuery ) {
var baseUrl = 'https://overpass-api.de/api/interpreter'
var bounds = map . getBounds ( ) . getSouth ( ) + ',' + map . getBounds ( ) . getWest ( ) + ',' + map . getBounds ( ) . getNorth ( ) + ',' + map . getBounds ( ) . getEast ( )
var resultUrl , query = ''
if ( overrideQuery ) {
query = ` ?data=[out:json][timeout:15];(
node [ amenity = charging _station ] ( $ { bounds } ) ;
) ; out body geom ; `
} else {
var nodeQuery = 'node[' + overpassQuery + '](' + bounds + ');'
var wayQuery = 'way[' + overpassQuery + '](' + bounds + ');'
var relationQuery = 'relation[' + overpassQuery + '](' + bounds + ');'
query = '?data=[out:json][timeout:15];(' + nodeQuery + wayQuery + relationQuery + ');out body geom;'
}
resultUrl = baseUrl + query
return resultUrl
}
2024-10-18 00:47:01 +02:00
const tags _to _display _in _popup = [
'name' ,
'capacity' ,
'date_start' ,
2024-10-17 15:01:47 +02:00
'charging_station:output' ,
2024-10-18 00:47:01 +02:00
'socket:type_2' ,
'socket:type2:output' ,
2024-10-17 15:01:47 +02:00
'socket:typee' ,
2024-10-18 00:47:01 +02:00
'socket:typee:output' ,
2024-10-17 15:01:47 +02:00
'socket:type2_combo' ,
2024-10-18 00:47:01 +02:00
'socket:type2_combo:output' ,
2024-10-17 15:01:47 +02:00
'socket:chademo' ,
'operator' , 'ref:EU:EVSE' ,
2024-10-18 00:33:25 +02:00
'network' ,
2024-10-18 00:47:01 +02:00
'opening_hours' ,
2024-10-17 15:01:47 +02:00
'contact' ,
2024-10-18 00:47:01 +02:00
'phone' ,
'contact:phone' ,
'website' ,
'contact:website' ,
'ref' ,
'fee' ,
'payment' ,
'payment:contactless' ,
'authentication:app' ,
'authentication:debit_card' ,
]
2024-10-17 15:01:47 +02:00
2024-10-18 00:33:25 +02:00
function supprimerMarqueurs ( map ) {
map . eachLayer ( ( layer ) => {
if ( layer instanceof L . Marker ) {
layer . remove ( )
}
} )
}
const colors = [
2024-11-26 21:31:43 +01:00
'#36423d' ,
'#4e8a8d' ,
'#2999b3' ,
'#1782dd' ,
'#2900ff' ,
2024-10-18 00:33:25 +02:00
]
2024-10-18 00:47:01 +02:00
2024-11-26 21:31:43 +01:00
function guessOutputPowerFromFeature ( feature ) {
let outputPower = 0
2024-10-18 00:33:25 +02:00
if ( feature . properties && feature . properties . tags ) {
2024-11-26 21:31:43 +01:00
/ * *
* fouiller dans les tags les valeurs explicites de puissance déclarée .
* Deviner aussi les puissances non déclarées :
* - type 2 présent , max 43 kW
* - type Chademo présent , max 63 kW
* https : //forum.openstreetmap.fr/t/bornes-de-recharges-et-puissance-chargeurs-quel-est-votre-avis/27828
*
* /
let found _type _2 = false ;
let found _type _chademo = false ;
2024-10-18 00:33:25 +02:00
for ( var tag in feature . properties . tags ) {
2024-11-26 21:31:43 +01:00
if ( tag . indexOf ( 'type2' ) !== - 1 ) {
// console.log('tag type2', tag)
found _type _2 = true ;
power = 43
}
if ( tag . indexOf ( 'chademo' ) !== - 1 ) {
found _type _chademo = true ;
console . log ( 'tag chademo' , tag )
power = 63
}
2024-10-18 00:33:25 +02:00
let value = feature . properties . tags [ tag ]
2024-10-18 00:47:01 +02:00
if ( value && tag . toLowerCase ( ) . indexOf ( 'output' ) !== - 1 ) {
2024-10-18 00:33:25 +02:00
console . log ( 'tag contient output' , tag , value )
2024-10-18 00:47:01 +02:00
value = '' + value
if ( value . replace ) {
2024-10-18 00:33:25 +02:00
value = value . replace ( ' ' )
value = value . replace ( 'kW' , '' )
}
var power = parseInt ( value )
2024-11-26 21:31:43 +01:00
// deviner les types de prises présents
if ( power )
{
console . log ( 'power' , power )
console . log ( 'outputPower' , outputPower )
}
2024-10-18 00:33:25 +02:00
if ( power > outputPower ) {
outputPower = power
console . log ( 'power' , power )
}
}
}
}
2024-11-26 21:31:43 +01:00
return outputPower
}
2024-10-18 00:47:01 +02:00
2024-11-26 21:31:43 +01:00
function getColor ( feature ) {
let outputPower = guessOutputPowerFromFeature ( feature )
2024-10-18 00:33:25 +02:00
feature . properties . tags . has _output _of _irve _specified = outputPower
2024-11-26 21:31:43 +01:00
if ( outputPower ) {
2024-10-18 00:33:25 +02:00
var index = Math . min ( Math . floor ( outputPower / 10 ) , colors . length - 1 )
console . log ( 'outputPower' , outputPower )
2024-11-26 21:31:43 +01:00
// console.log('colors[index]', colors[index])
2024-10-18 00:33:25 +02:00
return colors [ index ]
2024-11-26 21:31:43 +01:00
}
// autrement, sans puissance max trouvée, on met la couleur des indéfinis
return unknown _color
2024-10-18 00:33:25 +02:00
}
2024-10-17 15:01:47 +02:00
function displayPointsFromApi ( points ) {
var resultAsGeojson = osmtogeojson ( points )
var resultLayer = L . geoJson ( resultAsGeojson , {
style : function ( feature ) {
return { color : '#f00' }
} ,
filter : function ( feature , layer ) {
var isPolygon = ( feature . geometry ) && ( feature . geometry . type !== undefined ) && ( feature . geometry . type === 'Polygon' )
if ( isPolygon ) {
feature . geometry . type = 'Point'
var polygonCenter = L . latLngBounds ( feature . geometry . coordinates [ 0 ] ) . getCenter ( )
feature . geometry . coordinates = [ polygonCenter . lat , polygonCenter . lng ]
}
return true
} ,
onzoomend : function ( event ) {
console . log ( 'event' , event )
} ,
onEachFeature : function ( feature , layer ) {
var popupContent = ''
2024-10-18 00:33:25 +02:00
// console.log('feature.properties', feature.properties)
2024-10-17 15:01:47 +02:00
// popupContent = popupContent + '<dt>@id</dt><dd> capacité: ' + feature.properties.tags['capacity'] + '</dd>'
var keys = Object . keys ( feature . properties . tags )
// ne montrer que certains champs dans la popup
tags _to _display _in _popup . forEach ( function ( key ) {
if ( tags _to _display _in _popup . indexOf ( key ) ) {
let value = feature . properties . tags [ key ]
if ( value ) {
2024-11-26 21:31:43 +01:00
if ( value . indexOf ( 'http' ) !== - 1 ) {
value = '<a href="' + value + '">' + value + '</a>'
}
popupContent = popupContent + '<br/><strong class="popup-key">' + key + ' :</strong><span class="popup-value">' + value + '</span>'
2024-10-17 15:01:47 +02:00
}
}
} )
// popupContent = popupContent + '</dl>'
layer . bindPopup ( popupContent )
let iconSiZePx = 20
let rest _name = ''
2024-11-26 21:31:43 +01:00
let outPowerGuessed = guessOutputPowerFromFeature ( feature )
let color = getColor ( feature )
let displayOutPowerGuessed = '? kW' ;
if ( outPowerGuessed ) {
displayOutPowerGuessed = outPowerGuessed + ' kW max'
}
if ( ! popupContent ) {
popupContent = '<span class="no-data"> Aucune information renseignée, <a class="edit-button" href="https://www.openstreetmap.org/edit?editor=id&node=' + feature . properties . id + '">ajoutez la dans OpenStreetMap!</a></span>'
}
2024-10-17 15:01:47 +02:00
let html = '<a class="edit-button" href="https://www.openstreetmap.org/edit?editor=id&node=' + feature . properties . id + '">' +
2024-11-26 21:31:43 +01:00
'✏️</a> <span class="color-indication" style="background-color: ' + color + ';">' + displayOutPowerGuessed + '</span> <br/>' + popupContent
2024-10-17 15:01:47 +02:00
2024-10-18 00:33:25 +02:00
// console.log('layer', layer)
2024-11-26 21:31:43 +01:00
let marker = L . marker ( layer . _latlng , {
2024-10-17 15:01:47 +02:00
icon : L . divIcon ( {
2024-10-18 00:33:25 +02:00
iconUrl : '/img/beer.jpg' ,
//+ getIconFromTags(feature.properties.tags),
2024-10-17 23:57:47 +02:00
// className: 'label ' + makeCssClassFromTags(feature.properties.tags),
2024-10-17 15:01:47 +02:00
iconSize : [ 'auto' , 'auto' ] ,
} ) ,
2024-11-26 21:31:43 +01:00
} )
if ( outPowerGuessed ) {
2024-10-17 15:01:47 +02:00
2024-11-26 21:31:43 +01:00
marker . bindTooltip ( outPowerGuessed + ' kW max' ,
{
permanent : false ,
direction : 'right'
}
)
}
marker . addTo ( map )
let radius = 10
if ( outPowerGuessed > 300 ) {
2024-10-18 00:47:01 +02:00
radius = 200
2024-11-26 21:31:43 +01:00
}
else if ( outPowerGuessed > 200 ) {
radius = 250
}
else if ( outPowerGuessed > 100 ) {
radius = 150
}
else if ( outPowerGuessed > 50 ) {
2024-10-18 00:47:01 +02:00
radius = 100
2024-10-18 00:33:25 +02:00
}
2024-11-26 21:31:43 +01:00
else if ( outPowerGuessed > 20 ) {
radius = 50
}
else if ( outPowerGuessed > 7 ) {
radius = 20
}
2024-10-17 23:57:47 +02:00
let circle = L . circle ( layer . _latlng , {
2024-10-18 00:33:25 +02:00
color : color ,
fillColor : color ,
fillOpacity : 0.8 ,
radius : radius
} ) . addTo ( map )
2024-10-17 15:01:47 +02:00
2024-10-17 23:57:47 +02:00
circle . bindPopup ( html )
circle . on ( {
2024-10-17 15:01:47 +02:00
mouseover : function ( ) {
this . openPopup ( )
} ,
mouseout : function ( ) {
setTimeout ( ( ) => this . closePopup ( ) , 3000 )
} ,
click : function ( ) {
this . openPopup ( )
} ,
} )
} ,
} )
}
function makeCssClassFromTags ( tags ) {
console . log ( 'tags' , tags )
let tagKeys = Object . keys ( tags )
console . log ( 'tagKeys' , tagKeys )
if ( ! tags ) {
return ''
}
let listOfClasses = [ ]
tagKeys . forEach ( ( element ) => {
listOfClasses . push ( 'tag-' + element + '_' + tags [ element ] . replace ( ':' , '--' ) . replace ( ' ' , '-' ) )
} )
return listOfClasses . join ( ' ' )
}
function getIconFromTags ( tags ) {
let iconFileName = ''
// let iconFileName = 'icon_restaurant.png';
if ( tags [ 'man_made' ] ) {
iconFileName = 'fountain.png'
}
return iconFileName
}
$ ( '#query-button' ) . click ( function ( ) {
2024-10-18 00:33:25 +02:00
supprimerMarqueurs ( map )
2024-10-17 15:01:47 +02:00
loadOverpassQuery ( )
} )
let isLoading = false
function loadOverpassQuery ( ) {
// ne pas charger si on recherche déjà
if ( ! isLoading ) {
isLoading = true
$ ( '#spinning_icon' ) . fadeIn ( )
var queryTextfieldValue = $ ( '#query-textfield' ) . val ( )
var overpassApiUrl = buildOverpassApiUrl ( map , queryTextfieldValue )
$ . get ( overpassApiUrl , function ( geoDataPointsFromApi ) {
displayPointsFromApi ( geoDataPointsFromApi )
$ ( '#spinning_icon' ) . fadeOut ( )
2024-10-18 00:33:25 +02:00
$ ( '#message-loading' ) . fadeOut ( )
2024-10-17 15:01:47 +02:00
isLoading = false
} ) // end of the getting from overpass API
}
}
$ ( '#spinning_icon' ) . hide ( )
2024-10-18 00:33:25 +02:00
$ ( '#message-loading' ) . hide ( )
2024-10-17 15:01:47 +02:00
loadOverpassQuery ( )