Skip to content
Snippets Groups Projects
Commit 952550fd authored by digrazia2038's avatar digrazia2038 Committed by Benguria Elguezabal, Gorka
Browse files

almost fixed map

parent 886475ce
No related branches found
No related tags found
No related merge requests found
......@@ -14,6 +14,7 @@ export class DatastorageService {
this.apiURL = configService.getSettings("datastorageURL");
this.city = configService.getSettings("default_pilot");
this.city = this.city.toLowerCase();
// https://messina.urbanite.esilab.org/data/getTData/
}
getMapLayers(id:string = undefined): Observable<any> {
......@@ -23,4 +24,8 @@ export class DatastorageService {
return this.http.get<any>(`${this.apiURL}/getTData/mapLayer/${this.city}`);
}
}
getMessinaCycling(): Observable<any> {
return this.http.get<any>('https://messina.urbanite.esilab.org/data/getTData/gtfsShape/messina?filters=%7B%20%22alternateName%22%3A%22CyclingPaths%22%7D');
}
}
......@@ -4,12 +4,14 @@ import { MapLayersComponent } from './map-layers.component';
import { RouterModule, Routes } from '@angular/router';
import { MapComponent } from './map/map.component';
import { MapLayerFilterComponent } from './map-layer-filter/map-layer-filter.component';
import { AuthGuard } from '../../auth/services/auth.guard';
const routes: Routes = [
{
path:'',
component: MapLayersComponent,
canActivate: [AuthGuard],
children: [
{
path:"map",
......
<div class="row d-flex justify-content-between align-items-center">
<nb-card class="col-6" size="large">
<div class="row ">
<div class="col-8">
<nb-card size="large">
<nb-card-header>
Layers in map
</nb-card-header>
<nb-card-body>
<div leaflet #map
[leafletOptions]="options"
(leafletMapReady)="onMapReady($event)"
>
<div leaflet #map [leafletOptions]="options" (leafletMapReady)="onMapReady($event)">
</div>
</nb-card-body>
</nb-card>
<nb-card class="col-6" size="large">
</div>
<div class="col-4">
<nb-card size="large">
<nb-card-header>
Available Layers list <button style="float: right" nbButton size="small" status="info" (click)="openGuide()">{{'general.guide'|translate}}</button>
Available Layers list <button style="float: right" nbButton size="small" status="info"
(click)="openGuide()">{{'general.guide'|translate}}</button>
</nb-card-header>
<nb-card-body>
<mat-selection-list (selectionChange)="onChange($event)" [(ngModel)]="selectedLayers" [disabled]="isDisabled">
<mat-list-option *ngFor="let layer of availableLayers;let indexOfelement=index;" (indexOfelement) = "selectedLayerId" [value]="layer">
{{layer}}
<mat-selection-list (selectionChange)="onChange($event)">
<mat-list-option *ngFor="let layer of layersByPilot[pilot]" [value]="layer">
<p>
<nb-icon icon="info" [nbTooltip]="layersByPilot[pilot]"></nb-icon>&nbsp;{{layer}}
</p>
</mat-list-option>
</mat-selection-list>
</nb-card-body>
<nb-card-footer>
<nb-card class="row">
<nb-card-header>
Selected layer informations
</nb-card-header>
<nb-card-body>
{{layerDescr}}
</nb-card-body>
<nb-card-footer>
<button nbButton status="info" [value] = "selectedLayerId" (click)="loadLayer($event)">
Load Layer
</button>
</nb-card-footer>
</nb-card>
</nb-card-footer>
</nb-card>
</div>
</div>
\ No newline at end of file
......@@ -5,6 +5,10 @@ import 'leaflet.heat/dist/leaflet-heat.js';
import { DashboardPageCrudService } from '../../dashboard-management/services/dashboard-page-crud.service';
import { MessinaClientService } from '../../messina/service/messina-client.service';
import Amsterdam_bike from '../../../../assets/map/map-component-maps/amsterdam_bike_request.json';
import Messina_cycling_path from '../../../../assets/map/map-component-maps/messina_cycling_paths.json';
import Messina_ATM_Stops from '../../../../assets/map/map-component-maps/atmStops.json';
import Messina_Cameras from '../../../../assets/map/map-component-maps/cameras.json';
import Messina_POIs from '../../../../assets/map/map-component-maps/messina_pois.json';
import Bilbao_air_quality from '../../../../assets/map/map-component-maps/bilbao_air_quality_request.json';
import Bilbao_bike from '../../../../assets/map/map-component-maps/bilbao_bike_request.json';
import Bilbao_sound from '../../../../assets/map/map-component-maps/bilbao_sound_request.json';
......@@ -20,35 +24,20 @@ import { NbDialogService } from '@nebular/theme';
templateUrl: './map.component.html',
})
export class MapComponent implements OnInit {
lat: number=0;
long: number=0;
addedDiv;
pointsFile = '/assets/geojsons/bilbao_wifi_request_edited_for_angular_test.json';
isDisabled: boolean = false;
selectedLayerId: number;
availableLayers: string[] = [];
layerDescr: string;
option: MatListOption;
selectedLayers: string[];
public map: L.Map;
layerAmsterdam_bike: L.GeoJSON;
layerBilbao_air_quality: L.GeoJSON;
layerBilbao_bike: L.GeoJSON;
// layerBilbao_sound: L.GeoJSON;
layerBilbao_sound_heat: L.HeatLayer;
layerBilbao_wifi: L.GeoJSON;
boundLayer: L.GeoJSON;
layers = [];
constructor(public dialogService: NbDialogService, private dashboardPageService: DashboardPageCrudService,
private configService: ConfigService, private dataStorageService: DatastorageService, private translateService: TranslateService, private messinaClientService: MessinaClientService,) {
}
legend = new (L.Control.extend({
options: { position: 'bottomright' }
}));
options = {
layers: [
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 18, attribution: '...' }),
],
zoom: 9,
center: L.latLng({ lat: this.lat, lng: this.long }),
};
heatOptions = {
radius: 12,
max: 1.0,
......@@ -57,53 +46,74 @@ export class MapComponent implements OnInit {
//gradient: { 0.5: 'green', 0.6: 'yellow', 1.0: 'red' },
minOpacity: 0.7
}
constructor(public dialogService: NbDialogService, private dashboardPageService: DashboardPageCrudService,
private configService: ConfigService, private dataStorageService: DatastorageService, private translateService: TranslateService,) {
pilot: string;
layersByPilot: { [key: string]: string[] } = {
MESSINA: ["Point of Interests", "ATM Stops", "Messina - Dinnamare", "Messina - Centro", "Messina - Litoranea", "Cameras"],
BILBAO: ["Bilbao Air Quality", "Bilbao Bike", "Bilbao Sound", "Bilbao Wifi"],
AMSTERDAM: ["Amsterdam Bike"],
HELSINKI: [],
URBANITE: ["Amsterdam Bike", "Bilbao Air Quality", "Bilbao Bike", "Bilbao Sound", "Bilbao Wifi", "Point of Interests", "ATM Stops", "Messina - Dinnamare", "Messina - Centro", "Messina - Litoranea", "Cameras"],
}
ngOnInit(): void {
//this.getLayersFromDataStorage();
this.layerAmsterdam_bike = this.getLayer('Amsterdam_bike', <any>Amsterdam_bike[0].map);
this.layerBilbao_air_quality = this.getLayer('Bilbao_air_quality', <any>Bilbao_air_quality[0].map);
this.layerBilbao_bike = this.getLayer('Bilbao_bike', <any>Bilbao_bike[0].map);
// this.layerBilbao_sound = this.getLayer('Bilbao_sound', <any>Bilbao_sound[0].map);
this.layerBilbao_wifi = this.getLayer('Bilbao_wifi', <any>Bilbao_wifi[0].map);
this.layerBilbao_sound_heat = L.heatLayer(this.heatLayerConverter(<any>Bilbao_sound[0].map), this.heatOptions);
coordinatesByPilot: { [key: string]: L.LatLngExpression } = {
MESSINA: [38.183333, 15.566667],
BILBAO: [43.2627100, -2.9252800],
AMSTERDAM: [52.3740300, 4.8896900],
HELSINKI: [60.1695200, 24.9354500],
}
this.layers.push(this.layerAmsterdam_bike);
this.layers.push(this.layerBilbao_air_quality);
this.layers.push(this.layerBilbao_bike);
// this.layers.push(this.layerBilbao_sound);
this.layers.push(this.layerBilbao_sound_heat);
geojsonLayerContent: { [key: string]: L.GeoJSON } = {
"Point of interests": <L.GeoJSON>this.getLayer("Point of interests", <any>Messina_POIs['results']['features']),
"ATM Stops": <L.GeoJSON>this.getLayer("ATM Stops", <any>Messina_ATM_Stops['results']['features']),
"Cameras": <L.GeoJSON>this.getLayer("Cameras", <any>Messina_Cameras['results']['features']),
//"Messina - Dinnamare": <any>this.messinaClientService.getCyclingPaths(), FUTURE IMPLEMENTATION
"Messina - Dinnamare": <L.GeoJSON>this.getLayer("Messina - Dinnamare", <any>Messina_cycling_path[0].location),
"Messina - Centro": <L.GeoJSON>this.getLayer("Messina - Centro", <any>Messina_cycling_path[1].location),
"Messina - Litoranea": <L.GeoJSON>this.getLayer("Messina - Litoranea", <any>Messina_cycling_path[2].location),
"Bilbao Air Quality": <L.GeoJSON>this.getLayer("Bilbao Air Quality", <any>Bilbao_air_quality[0].map),
"Bilbao Bike": <L.GeoJSON>this.getLayer("Bilbao Bike", <any>Bilbao_bike[0].map),
"Bilbao Wifi": <L.GeoJSON>this.getLayer("Bilbao Wifi", <any>Bilbao_wifi[0].map),
"Amsterdam Bike": <L.GeoJSON>this.getLayer("Amsterdam Bike", <any>Amsterdam_bike[0].map),
};
let pilot = this.configService.getSettings("default_pilot");
let bilbao: string[] = ["Bilbao Air Quality", "Bilbao Bike", "Bilbao Sound", "Bilbao Wifi"];
heatlayerLayerContent: { [key: string]: L.HeatLayer } = {
"Bilbao Sound": <L.HeatLayer>L.heatLayer(this.heatLayerConverter(<any>Bilbao_sound[0].map), this.heatOptions),
};
switch(pilot){
case "MESSINA":
this.boundLayer = this.layerBilbao_air_quality;
for (let i = 0; i < bilbao.length; i++){
this.availableLayers.push(bilbao[i]);
}
break;
case "HELSINKI":
this.boundLayer = this.layerBilbao_air_quality;
break;
case "BILBAO":
this.boundLayer = this.layerBilbao_air_quality;
for (let i = 0; i < bilbao.length; i++){
this.availableLayers.push(bilbao[i]);
}
break;
case "AMSTERDAM":
this.boundLayer = this.layerAmsterdam_bike;
this.availableLayers.push("Amsterdam Bike");
break;
public map: L.Map;
ngOnInit(): void {
this.pilot = this.configService.getSettings("default_pilot");
}
onChange(event: any) {
let clickedLayerName = event.option.value;
let geojsonLayer = <L.GeoJSON>this.geojsonLayerContent[clickedLayerName];
let heatLayer = <L.HeatLayer>this.heatlayerLayerContent[clickedLayerName];
if (event.option.selected === true) {
console.log("CHARGE LAYER-> " + clickedLayerName)
if (clickedLayerName !== "Bilbao Sound") {
this.map.addLayer(geojsonLayer);
this.map.fitBounds(geojsonLayer.getBounds(), {
padding: [50, 50]
});
} else {
this.map.addLayer(heatLayer);
}
}
else {
console.log("DECHARGE LAYER-> " + clickedLayerName)
if (clickedLayerName !== "Bilbao Sound") {
this.map = this.map.removeLayer(geojsonLayer);
} else {
this.map = this.map.removeLayer(heatLayer);
}
}
}
/**
* This transform geoJSON into array managed by leaflet for heatmap
* @param geoJson geoJSON
......@@ -118,19 +128,17 @@ export class MapComponent implements OnInit {
// console.log("Points result.length =>" + result.length + " result: " + result);
return result;
}
onMapReady(map: L.Map) {
this.map = map;
setTimeout(() => {
this.map.invalidateSize();
this.map.fitBounds(this.boundLayer.getBounds(), {
padding: [50, 50]
});
this.map.setView(this.coordinatesByPilot[this.configService.getSettings("default_pilot")], 13.5);
}, 50);
}
public getLayer(title, l): L.GeoJSON {
let layer = L.geoJSON(l,
{
onEachFeature: (feature, layer) => {
......@@ -155,148 +163,6 @@ export class MapComponent implements OnInit {
return layer;
}
onChange(event: any) {
this.option = event.option;
this.optionSettings();
// this.log("#1", event);
if (event.option.selected === true) {
// this.log("#2", event);
this.selectedLayerId = event.option.value;
// this.log("#OptionValue", null);
// this.log("#SelectedLayerIdValue", null);
// this.log("#3", event);
event.option.selected = false;
//this.layerDescr = this.getLayerDescription(event.option.value);
this.layerDescr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nec enim quis massa vehicula sollicitudin. Praesent luctus mauris felis, sed condimentum purus luctus in.";
}
if (event.option.selected === false) {
// console.log("UNCHECK");
// console.log("selectedLayerId VALUE");
// console.log(event.option.value)
this.removeLayer(event.option.value);
this.log("#4", event);
}
this.log("#5", event);
}
loadLayer(event: any) {
this.option.selected = true;
switch (event.target.value) {
case "Amsterdam Bike":
this.map.addLayer(this.layerAmsterdam_bike);
break;
case "Bilbao Air Quality":
this.map.addLayer(this.layerBilbao_air_quality);
break;
case "Bilbao Bike":
this.map.addLayer(this.layerBilbao_bike);
break;
case "Bilbao Sound":
this.map.addLayer(this.layerBilbao_sound_heat);
this.addedDiv = this.legend.onAdd = (map) => {
var div = L.DomUtil.create('div', 'info legend'),
grades = [0.0, 0.5, 1.0],
labels = ["Low level", "Medium level", "High level "];
div.innerHTML = '<div><b>Legend</b></div>';
for (var i = 0; i < grades.length; i++) {
div.innerHTML += '<i style="background: ' + this.getLegendColor(grades[i]) + '">'
+ '&nbsp;&nbsp;&nbsp;&nbsp;' + '</i> ' + labels[i] + (i + 1 < grades.length ? '</br>' : '');
}
this.addedDiv = div;
return div;
};
this.legend.addTo(this.map);
break;
case "Bilbao Wifi":
this.map.addLayer(this.layerBilbao_wifi);
break;
}
}
removeLayer(selectedLayerId: string) {
switch (selectedLayerId) {
case "Amsterdam Bike":
this.map.removeLayer(this.layerAmsterdam_bike);
break;
case "Bilbao Air Quality":
this.map.removeLayer(this.layerBilbao_air_quality);
break;
case "Bilbao Bike":
this.map.removeLayer(this.layerBilbao_bike);
break;
case "Bilbao Sound":
this.map.removeLayer(this.layerBilbao_sound_heat);
var div = L.DomUtil.remove(this.addedDiv);
break;
case "Bilbao Wifi":
this.map.removeLayer(this.layerBilbao_wifi);
break;
}
this.layerDescr = "";
}
getLayerDescription(selectedLayerId: string) : string {
switch (selectedLayerId) {
case "Amsterdam Bike":
// console.log("Amsterdam_bike[0].description");
// console.log(Amsterdam_bike[0].description);
return Amsterdam_bike[0].description;
case "Bilbao Air Quality":
return Bilbao_air_quality[0].description;;
case "Bilbao Bike":
return Bilbao_bike[0].description;
case "Bilbao Sound":
return Bilbao_sound[0].description;
case "Bilbao Wifi":
return Bilbao_wifi[0].description;;
}
}
optionSettings() {
this.option.color = 'primary';
}
log(step: string, event: any) {
switch (step) {
case "#1":
console.log("#1 event.option.selected VALUE");
console.log(event.option.selected);
break;
case "#2":
console.log("#2 event.option.selected VALUE");
console.log(event.option.selected);
break;
case "#3":
console.log("#3 event.option.selected VALUE");
console.log(event.option.selected);
break;
case "#4":
console.log("#4 event.option.selected VALUE");
console.log(event.option.selected);
break;
case "#5":
console.log("#5 event.option.selected VALUE");
console.log(event.option.selected);
break;
case "#6":
break;
case "#OptionValue":
console.log("OPTION VALUE");
console.log(this.option);
break;
case "#SelectedLayerIdValue":
console.log("selectedLayerId VALUE");
console.log(this.selectedLayerId);
break;
}
}
getLegendColor(v: number) {
let color = 'green';
if (v == 0.0) {
......@@ -309,17 +175,91 @@ export class MapComponent implements OnInit {
return color;
}
getLayersFromDataStorage(){
this.dataStorageService.getMapLayers().subscribe(res => {
console.log("DATA STORAGE RESULTS");
console.log(res);
})
}
openGuide() {
const dialogRef = this.dialogService
.open(DashboardGuideComponent,
{ context: { info: "Map Layers Guide" } });
}
private getIcon(type): string {
switch (type) {
case "Retail_Services":
return "store";
case "Restaurant":
return "utensils";
case "Medical_Facility":
return "heartbeat";
case "School":
return "school";
case "Sport_Recreation":
return "running";
case "City_Town_Center":
return "university";
case "Hotel":
return "h-square";
case "Enclosed_Carpark":
return "parking";
case "Automobile_Facility":
return "car-side";
case "Bus_Station":
return "bus";
case "Religious_Facility":
return "pray";
case "Open_Carpark":
return "parking";
case "Forest":
return "tree";
case "Cultural_Buildings":
return "building";
case "River":
return "water";
case "Rail_Station":
return "train";
case "Ferry":
return "ship";
case "Lake":
return "water";
case "Public_Buildings":
return "building";
case "WaterElements":
return "water";
case "Regio Nat State Park":
return "tree";
case "lndustrial_Area":
return "industry";
case "Industry":
return "industry";
case "Sand_Area":
return "umbrella-beach";
case "Tunnel":
return "archway";
case "Rail":
return "train";
}
return "map-marker"
}
buildGeoJSON(data: any) {
let result = [];
var geojsonModel = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": []
},
"properties": {
}
};
console.log("HERE");
console.log(Object.keys(data));
console.log(data['results'])
console.log(Object.keys(data['results']));
console.log(data['results']['features'])
console.log(Object.keys(data['results']['features']));
for (let feature in data['results']) {
console.log("R is");
console.log(feature);
}
}
}
\ No newline at end of file
......@@ -40,11 +40,22 @@ export class MessinaClientService {
}
getPOI(page: number = 0, pageSize: number = 40000): Observable<any> {
return this.http.get<any>(`${this.apiURL}/api/v1/data/POIs?page=${page}&pageSize=${pageSize}&format=geojson&token=${this.token}`);
return this.http.get<any>(`${this.apiURL}/api/v2/static/collection/POIs?page=${page}&pageSize=${pageSize}&format=geojson&token=${this.token}`);
}
getDataStoragePOIs(): Observable<any> {
return this.http.get<any>(`https://messina.urbanite.esilab.org/data/getTData/pointOfInterest/messina?limit=1000`);
}
getStops(page: number = 0, pageSize: number = 40000): Observable<any> {
return this.http.get<any>(`${this.apiURL}/api/v1/data/atmStops?page=${page}&pageSize=${pageSize}&format=geojson&token=${this.token}&filter=${JSON.stringify({ "mainStop": true })}`);
return this.http.get<any>(`${this.apiURL}/api/v2/static/collection/atmStops?page=${page}&pageSize=${pageSize}&format=geojson&token=${this.token}&filter=${JSON.stringify({ "mainStop": true })}`);
}
getCameras(page: number = 0, pageSize: number = 40000): Observable<any> {
return this.http.get<any>(`${this.apiURL}/api/v2/static/collection/cameras?page=${page}&pageSize=${pageSize}&format=geojson&token=${this.token}`);
}
getCyclingPaths(page: number = 0, pageSize: number = 40000): Observable<any> {
return this.http.get<any>(`${this.apiURL}/api/v2/static/collection/cyclingPaths?page=${page}&pageSize=${pageSize}&format=json&token=${this.token}`);
}
getBatchData(date: string, roads:string=undefined): Observable<any>{
......@@ -52,12 +63,10 @@ export class MessinaClientService {
// roads="Messina-Boccetta";
roads="A20 - Messina-Boccetta";
}
// https://urbanite-node1.comune.messina.it/api/v1/trafficBatch?token=mcOUnnIyupQJzbitPX7Q2MnyqrVQUkmo&date=2021-06-08T00:00:00Z&roads=A20 - Messina-Boccetta
return this.http.get<any>(`${this.apiURL}/api/v1/trafficBatch?date=${date}&roads=${roads}&token=${this.token}`);
}
getRoads(): Observable<any>{
// https://urbanite-node1.comune.messina.it/api/v1/roads?token=mcOUnnIyupQJzbitPX7Q2MnyqrVQUkmo
return this.http.get<any>(`${this.apiURL}/api/v1/roads?token=${this.token}`);
}
......
This diff is collapsed.
This diff is collapsed.
[{"id":"urn:ngsi-ld:GtfsShape:messina:CyclingPaths:CRS84:1","alternateName":"CyclingPaths","description":"Pista ciclabile Messina - Dinnamare","location":{"coordinates":[[15.5612754821777,38.2057461528513],[15.5396461486816,38.2137042649229],[15.5279731750488,38.2217626526206],[15.5256128311157,38.2283031144339],[15.5229520797729,38.2282019777484],[15.5219650268555,38.2273928792016],[15.5218362808228,38.2263140671392],[15.5210638046265,38.2264152064497],[15.5202054977417,38.2273254539165],[15.5213642120361,38.2298538593357],[15.5227375030518,38.2319439414548],[15.5241537094116,38.2345058956597],[15.5190896987915,38.229449320375],[15.5154848098755,38.2247969606063],[15.5132102966309,38.2201780192588],[15.5113220214844,38.217716711774],[15.5091762542725,38.218289900406],[15.5061721801758,38.2153227575021],[15.5024814605713,38.2124566523255],[15.5002498626709,38.2096241551407],[15.49720287323,38.2074322661897],[15.4951858520508,38.2059484885141],[15.4920101165771,38.1995746449794],[15.4849290847778,38.1928629579669],[15.4799938201904,38.1879046813689],[15.4727840423584,38.1738375293672],[15.4648876190186,38.1668198052653],[15.4643297195435,38.1587890805601]],"type":"LineString"},"name":"Messina - Dinnamare","type":"GtfsShape","@context":["https:\/\/smartdatamodels.org\/context.jsonld","https:\/\/uri.etsi.org\/ngsi-ld\/v1\/ngsi-ld-core-context.jsonld"],"dateCreated":"2022-10-14T09:39:09.016Z","dateModified":"2022-10-14T09:39:09.016Z"}, {"id":"urn:ngsi-ld:GtfsShape:messina:CyclingPaths:CRS84:2","alternateName":"CyclingPaths","description":"Pista ciclabile Messina - Centro","location":{"coordinates":[[15.556404590607,38.197247547181],[15.55163025856,38.189414124437],[15.552043318749,38.189178012077],[15.552424192429,38.188967197626],[15.552581101656,38.189100010947],[15.552727282047,38.188996711505],[15.552932471037,38.188906060766],[15.553153753281,38.188773246963],[15.553459525108,38.188596161463],[15.55367410183,38.188478104766],[15.555133223534,38.19032059499],[15.556321442127,38.191861615525],[15.556497126818,38.19204186355],[15.556568875909,38.192110906863],[15.556604750454,38.192143320436],[15.556640625,38.192142005046],[15.557144880295,38.19711264068],[15.556860566139,38.197175878031],[15.556436777115,38.197289705411],[15.556404590607,38.197247547181]],"type":"LineString"},"name":"Messina - Centro","type":"GtfsShape","@context":["https:\/\/smartdatamodels.org\/context.jsonld","https:\/\/uri.etsi.org\/ngsi-ld\/v1\/ngsi-ld-core-context.jsonld"],"dateCreated":"2022-10-14T09:39:09.024Z","dateModified":"2022-10-14T09:39:09.024Z"}, {"id":"urn:ngsi-ld:GtfsShape:messina:CyclingPaths:CRS84:3","alternateName":"CyclingPaths","location":{"coordinates":[[15.565814,38.218324],[15.5655241012573,38.2208523355462],[15.5656099319458,38.2223020944011],[15.5667686462402,38.2248306744285],[15.5687856674194,38.226920900893],[15.56960105896,38.2284379631292],[15.5700302124023,38.2298201478416],[15.5710601806641,38.2329552499491],[15.5720043182373,38.2344721863219],[15.5731201171875,38.2355171685269],[15.5760169029236,38.2369497810148],[15.5778193473816,38.2380115814698],[15.5783772468567,38.2375059641392],[15.5791068077087,38.2379441660288]],"type":"LineString"},"name":"Messina - Litoranea","type":"GtfsShape","@context":["https:\/\/smartdatamodels.org\/context.jsonld","https:\/\/uri.etsi.org\/ngsi-ld\/v1\/ngsi-ld-core-context.jsonld"],"dateCreated":"2022-10-14T09:39:09.028Z","dateModified":"2022-10-14T09:39:09.028Z"}]
\ No newline at end of file
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment