package Karte_osm; # # SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) Rainer Gümpelein, TeilRad GmbH # use strict; use warnings; use CGI ':standard'; use Lib::Config; use Mod::Buttons; use Mod::DBtank; use Mod::APIfunc; sub new { my $class = shift; my $self = {}; bless($self,$class); return $self; } #Template sub tpl(){ my $node_meta = shift; my $users_dms = shift || ""; my $mode = shift || ""; my $varenv = shift; my $users_sharee = shift || { c_id => 0 }; my $feedb = shift || ""; my $q = new CGI; my $but = new Buttons; my $dbt = new DBtank; my $apif = new APIfunc; my $api_file = "/var/www/copri4/shareeconf/apikeys.cfg"; my $aconf = Config::General->new($api_file); my %apikeyconf = $aconf->getall; my $api_return = { authcookie => '' }; my $coo = $q->cookie(-name=>'domcookie') || $R::sessionid; ($api_return,$users_sharee) = $apif->auth_verify($q,$coo,""); my $man_gps = $q->escapeHTML($R::man_gps) || ""; my $initMap = $dbt->{website}->{$varenv->{syshost}}->{initMap}; my $map_zoom = $dbt->{website}->{$varenv->{syshost}}->{map_zoom} || "10"; my $project = "all"; my $uri_request = $dbt->{primary}->{sharee_primary}->{primaryApp}; if($dbt->{website}->{$varenv->{syshost}}->{merchant_id}){ $api_return->{authcookie} = $dbt->{website}->{$varenv->{syshost}}->{merchant_id} if(!$api_return->{authcookie}); $project = $dbt->{website}->{$varenv->{syshost}}->{project} if($dbt->{website}->{$varenv->{syshost}}->{project}); $uri_request = $dbt->{website}->{$varenv->{syshost}}->{operatorWeb}; if($project eq "Freiburg"){ print $q->div({-style=>"color:#026666;font-size:20px;padding-bottom:12px;"},"Hier können Lastenräder gemietet werden"),"\n"; }else{ print $q->div({-class=>"content2_contact"},"Hier können Lastenfahrräder gemietet werden:"),"\n"; } }elsif($dbt->{operator}->{$varenv->{dbname}}->{merchant_id}){ $api_return->{authcookie} = $dbt->{operator}->{$varenv->{dbname}}->{merchant_id} if(!$api_return->{authcookie}); $initMap = $dbt->{operator}->{$varenv->{dbname}}->{initMap} if($dbt->{operator}->{$varenv->{dbname}}->{initMap}); $map_zoom = $dbt->{operator}->{$varenv->{dbname}}->{map_zoom} if($dbt->{operator}->{$varenv->{dbname}}->{map_zoom}); $project = $dbt->{operator}->{$varenv->{dbname}}->{project} if($dbt->{operator}->{$varenv->{dbname}}->{project}); $uri_request = $dbt->{operator}->{$varenv->{dbname}}->{operatorDMS}; print $q->div({-style=>'padding-top:40px;'},""),"\n"; print $q->start_form(),"\n"; print $q->div({-style=>'text-align:left;'},$but->singlesubmit1("set_gps","set_gps","",""),$q->textfield(-name=>'man_gps', -value=>"$man_gps", -override=>1, -placeholder=>'latitude, longitude',-size=>30)),"\n"; print $q->end_form,"\n"; }elsif($dbt->{primary}->{$varenv->{dbname}}->{merchant_id}){ $api_return->{authcookie} = $dbt->{primary}->{$varenv->{dbname}}->{merchant_id} if(!$api_return->{authcookie}); $initMap = $dbt->{primary}->{$varenv->{dbname}}->{initMap} if($dbt->{primary}->{$varenv->{dbname}}->{initMap}); $uri_request = $dbt->{primary}->{$varenv->{dbname}}->{primaryDMS}; print $q->div({-style=>'padding-top:40px;'},""),"\n"; print $q->start_form(),"\n"; print $q->div({-style=>'text-align:left;'},$but->singlesubmit1("set_gps","set_gps","",""),$q->textfield(-name=>'man_gps', -value=>"$man_gps", -override=>1, -placeholder=>'latitude, longitude',-size=>30)),"\n"; print $q->end_form,"\n"; } my $manlat = ""; my $manlng = ""; $manlat = $1 if($man_gps =~ /^(\d+\.\d+)/); $manlng = $1 if($man_gps =~ /(\d+\.\d+)$/); my $icon_green = "Open_Green.png"; my $icon_red = "Open_Red.png"; my $icon_blue = "Open_Blue.png"; my $mapheight = "800px;"; if($project eq "Bayern"){ $icon_green = "LastenradBay_Standortpfeil_gruen_03a.png"; $icon_red = "LastenradBay_Standortpfeil_rot_03a.png"; $icon_blue = "LastenradBay_Standortpfeil_blau_03a.png"; $mapheight = "800px;" if($varenv->{syshost} !~ /shareedms-/); }elsif($project eq "Freiburg"){ $mapheight = "500px;"; } $users_sharee->{c_id} = "0" if(!$users_sharee->{c_id}); $initMap =~ s/\s//g; my ($lat,$lng) = split(/,/,$initMap); print "
\n"; print< EOF ; print "
\n"; print< var map = L.map('map', { scrollWheelZoom: false }).setView([$lat, $lng], $map_zoom); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }).addTo(map); var icon_green = L.icon({ iconUrl: '$varenv->{metahost}/img/$icon_green', iconSize: [37, 37], iconAnchor: [20, 37], popupAnchor: [-2, -36] //shadowUrl: 'marker-shadow.png', //shadowSize: [68, 95], //shadowAnchor: [22, 94] }); var icon_red = L.icon({ iconUrl: '$varenv->{metahost}/img/$icon_red', iconSize: [37, 37], iconAnchor: [20, 37], popupAnchor: [-2, -36] }); //stations and bikes at all if('$dbt->{operator}->{$varenv->{dbname}}->{merchant_id}'){ Promise.all([ fetch( "$uri_request/GBFSout?request=stations_available&authcookie=$api_return->{authcookie}" ), fetch("$uri_request/GBFSout?request=bikes_available&authcookie=$api_return->{authcookie}") ]).then(async ([response1, response2]) => { const responseData1 = await response1.json(); const responseData2 = await response2.json(); const data1 = responseData1.data.stations; const data2 = responseData2.data.vehicles; const layerGroup = L.featureGroup().addTo(map); data1.forEach(({ lat, lon, name, address, station_id: stationId }) => { let bikesonstation = ''; console.log('Station: ' + stationId , name); data2.forEach(({ station_id, vehicle_name, vehicle_id }) => { if(typeof station_id !== 'undefined' && station_id == stationId){ bikesonstation = bikesonstation.concat('• Verfügbar: ' + vehicle_name + ' ' + vehicle_id + '
'); } }); console.log(bikesonstation); //bike_array.forEach((bike, index) => { //console.log('xxxx ' + index + ':' + bike); //}); if(bikesonstation){ layerGroup.addLayer( L.marker([lat, lon], { icon:icon_green }).bindPopup( `Mietradstation: \${name} \${stationId}
\${bikesonstation} ` ) ); }else{ layerGroup.addLayer( L.marker([lat, lon], { icon:icon_red }).bindPopup( `Mietradstation: \${name} \${stationId}
` ) ); } }); if('$manlat' && '$manlng'){ layerGroup.addLayer( L.marker([$manlat, $manlng]).bindPopup( '$manlat, $manlng' ) ); } map.fitBounds(layerGroup.getBounds()); }); } //Only stations with bike_count else{ Promise.all([ fetch( "$uri_request/GBFSout?request=stations_available&authcookie=$api_return->{authcookie}" )]).then(async ([response1]) => { const responseData1 = await response1.json(); const data1 = responseData1.data.stations; const layerGroup = L.featureGroup().addTo(map); data1.forEach(({ lat, lon, name, address, bike_count, station_id: stationId }) => { console.log('Station: ' + stationId , name); if(bike_count > 0){ layerGroup.addLayer( L.marker([lat, lon], { icon:icon_green }).bindPopup( `Mietradstation: \${name} \${stationId}
Verfügbare Mieträder: \${bike_count} ` ) ); }else{ layerGroup.addLayer( L.marker([lat, lon], { icon:icon_red }).bindPopup( `Mietradstation: \${name} \${stationId}
Aktuell ist kein Mietrad verfügbar ` ) ); } }); if('$manlat' && '$manlng'){ layerGroup.addLayer( L.marker([$manlat, $manlng]).bindPopup( '$manlat, $manlng' ) ); } map.fitBounds(layerGroup.getBounds()); }); } EOF ; print "
\n"; print $q->div({-class=>"content2_legende"}, $q->img({-style=>'height:37px;', -src=>"$varenv->{metahost}/img/$icon_green"}), "Lastenrad verfügbar"),"\n"; print $q->div({-class=>"content2_legende"}, $q->img({-style=>'height:37px;', -src=>"$varenv->{metahost}/img/$icon_red"}), "Lastenrad nicht verfügbar"),"\n"; #print $q->div({-class=>"content2_legende"}, " "),"\n"; print "$initMap|$varenv->{dbname}|$api_return->{authcookie}|$users_sharee->{c_id}" if($users_dms->{u_id} == $dbt->{copri_conf}->{superu_id}); #print "$uri_request/GBFSout?request=stations_available&authcookie=$api_return->{authcookie}"; } 1;