de-qua / v4w_website Goto Github PK
View Code? Open in Web Editor NEWA Flask-powered framework for the dequa web platform. Currently in development from full site to just API backend.
License: GNU Affero General Public License v3.0
A Flask-powered framework for the dequa web platform. Currently in development from full site to just API backend.
License: GNU Affero General Public License v3.0
capire, decidere, attivare
Costruiamo il nostro bugtracer
ogni volta che troviamo un bug clicchiamo il bottoncino (che avra l'icona dell'insetto, quindi bug) che crea un file (pickle, json, csv, come vogliamo) per il singolo bug
Parallelamente creiamo una pagina per visualizzare e gestire i bug. Una parte della pagina e esterna, magari il chiuderli resta interno!
invadiamo il sito bootleaf con una ricercamigliore
https://github.com/bmcbride/bootleaf
Come possiamo gestire gli iFrame in modo che possiamo embeddare la nostra pagina, ma non tutti possono?
il sito del comune ha un limite di 1000 nelle liste e noi vorremmo scaricarli tutti in una volta
http://geoportale.comune.venezia.it/Html5Viewer/index.html?viewer=sma.sma&LOCALE=IT-it
fastidiosi - dobbiamo gestirli e convertirli a poligoni (multipoligoni non sono neanche supportati da leaflet
Se salviamo la linea per ogni indirizzo il bound[0:2]
è la coordinata del nodo sul grafo spezzettato (ancora da testare per le performance). A quel punto, quando passiamo la path da plottare a leaflet, gli aggiungiamo la shape dell'indirizzo, e magicamente il percorso diventa perfetto.
Diventa molto importante individuare l'indirizzo dei POI per poter avere questo effetto magico. Si potrebbe individuare cercando quale dei bound[2:4]
è il più vicino alle coordinate del POI in fase di costruzione del database, con un certo livello di tolleranza (deve essere molto vicino per essere attribuito a quell'indirizzo) e con dei distinguo a seconda della categoria del POI.
Questa issue è strettamente collegata alla #12 ma riguarda specificatamente la costruzione del db.
Potrebbe essere una cazzata, ma penso che il calcolo del percorso breve, potrebbe essere strutturato in una classe, dandogli una struttura organizzata, perché mi accorgo che abbiamo sempre più manipolazioni da fare. La classe potrebbe lavorare così:
viene inizializzata con una location di partenza, una di arrivo (magari opzionale se poi vogliamo inventare le passeggiate casuali) e i grafi (anche questo opzionale, solo grafo terrestre o solo grafo acqueo o entrambi).
I suoi metodi le permettono di:
Uno dei vantaggi di questa struttura è che aiuta a pensare la generazione di percorsi diversi da confrontare. Ma se ne può anche fare a meno, me ne rendo conto!
127 strade vuote su 2828:
[CASSELERIA, CAMPIELLO GIOVANNI ANDREA DELLA CROCE O DE LA MALVASIA, CAMPO UGO FOSCOLO GIA' DE LE GATE , RIVA DEI SCHIAVONI, LISTA VECHIA DEI BARI, CORTE SPECHIERA, CORTE DE LE PIZZOCHERE, RIO TERA' SAN PATERNIAN, FONDAMENTA ZORZI O BRAGADIN DETTA DE L'OSPEDALETO, CALLE DE LE BECCARIE, FONDAMENTA VENIER DAI LEONI, GHETTO VECHIO, PONTE DEI LUSTRAFERI, RIO TERA' SAN SILVESTRO, CORTE CONTARINA, FONDAMENTA DEL RIO MARIN O DEI GARZOTI, SALIZADA SANTISSIMI GIOVANNI E PAOLO O ZANIPOLO, FONDAMENTA DEL SOCORSO, CORTE SABIONCELA, ZATTERE AL PONTE LONGO, RIO TERA' DEI GESUATI, CALLE SECO MARINA, RIO TERA' BARBA FRUTARIOL, SOTOPORTEGO DE MEZZO, RAMPA SAN BASILIO, FONDAMENTA DEL MALCANTON, CALLE DE LA BISSA , RIO TERA' DEI BIRI O DEL PARSEMOLO, CORTE SORANZO, PONTE DEL MODENA, RAMO DE MEZO, PONTE DE RIALTO, RUGHETA DEL RAVANO, RIO TERA' DEL BAGATIN, CAMPO SANTISSIMI GOVANNI E PAOLO O ZANIPOLO, CALLE SAN ZULIAN GIA' DEL STRAZZARIOL, CAMPIELLO DE L'ANCONETA, CAMPIELLO DE LE STROPE, RIO TERA' SANT'APONAL, CALLE SECHERA, CALLE DE LE BECARIE, RAMO SECONDO DE LA PEGOLA O DE L'ARSENAL, CAMPO CESARE BATTISTI GIA' DE LA BELLA VIENNA, CORTE BOTERA, CHIOVERETE DE S. SIMON, CALLE DEI BOTTERI, PONTE DEI BARETERI, CORTE DEL LUGANEGHER, RAMO DE LA SALIZADA, CALLE DE LA PANADA, CORTE DEL FORNO VECHIO, FONDAMENTA SAN GIOACHIN, SALIZADA STRETA, CAMPO DE LE BECARIE, SALIZADA DEI SPECHIERI, SALIZADA SAN GIOVANNI CRISOSTOMO, CORTE DEL TEATRO VECHIO, FONDAMENTA TRAPOLINA, FONDAMENTA DEI ARSENALOTI O PORTINARI, CAMPIELLO DEL BOTER, RIO TERA' DEI NOMBOLI, CALLE TERAZZERA, PONTE DE LE BECARIE, CALLE DE MEZZO, SALIZZADA DEL FORNO, RAMO DE LE MOSCHETE, FONDAMENTA TRAPOLINA , CAMPIELLO DE LE BECARIE, CALLE DE LA SCUOLA DEI BOTERI, SALIZZADA DE LA CHIESA O DEL TEATRO, FONDAMENTA DE LE ZATTERE AI SALONI, CAMPIELLO WIDMANN GIA' BIRI, PONTE SAN PANTALON, CAMPIELLO DEI CALEGHERI, CALLE DE L'OCHIO GROSSO, RIO TERRA', CORTE TRAPOLINA, CAMPO DE LE STROPE, CORTE DEL BAGOLARO, CAMPIELLO DEL BATELO, CORTE DEL SABION, CAMPIELLO DEL CENTOPIETRE GIA' CENTO PIETRE, CORTE DE LA PAZIENZA, CORTE DE LE PIZZOCARE, CORTE DEI VEDEI, RIVA CA' DI DIO, PONTE SAN GIOVANNI GRISOSTOMO, RAMO BRUSA', CORTE DEL SQUERO VECHIO, PONTE BALBI, FONDAMENTA DE LE SECHERE, PASINA, RAMO DRIO AI INCURABILI, CAMPIELLO ZEN GIA' CERESA, PONTE DEI CONSORZI, CALLE GALEAZZA, CALLE MORANDO, CALLE DEI ZOTTI, CALLE COLONNELLA, CORTE TERAZZER, CORTE CONTARINI, CORTE DE CA' PISANI, PONTE DEL RIMEDIO, PONTE DE LA CROSE, CALLESELA QUERINI, PONTE SANT'ANTONIO, SOTOPORTEGO TRAPOLINA, SOTOPORTEGO CA' POZZO , ORTE DEL CAPPELLAN, FONDAMENTA DEL REMEDIO, FONDAMENTA DEL BATECLO, CALLESELE, CORTE ZCONTARINI, PIAZZALE TRONCHETTO, CALLE STRETTA MOROSINI O PISANI, PONTE CAVALLO, PONTE DEI FUSERI, CALLE DEL FRUTAROL DETTO DE LA MALVASIA, CAMPO SANTA MARIA MAGGIORE, CAMPO SAN CASSIAN, PONTE DE LA GUERRA, PONTE DE L'ANCONETA, CALLE DE LA RIVETA, PONTE DEL CRISTO, CALLE QUERINI, CAMPIELLO MARINONI O DELLA FENICE, PONTE GIAMBATTISTA GALLICCIOLI GIA' DEI MORTI]
implica il cambio di metodo per il calcolo del percorso breve (senza ponti), in modo che ritorni anche la lunghezza del percorso.
Per il prercorso con ponti rischia di essere più complicato: un'idea potrebbe essere far pesare i ponti 100000, in modo che dividendo la lunghezza per 100000 e sottraendolo alla lunghezza, ci ritroviamo con la lunghezza giusta. Il difetto è che ci toglie la possibilità di avere una "scala di pigrizia", anche se non ci sono particolarmente affezionato. La soluzione lunga è fare una piccola funzione che calcola la lunghezza del percorso senza usare i metodi di networkx (o magari c'è un metodo di nt che calcola solo la lunghezza!)
Bisognerebbe eliminare lo scaricamento dei poi tramite Java e automatizzarlo (in modo da farlo andare ad esempio una volta a settimana).
La cosa bella è che (come quasi sempre) è già tutto fatto: https://towardsdatascience.com/loading-data-from-openstreetmap-with-python-and-the-overpass-api-513882a27fd0
Qua la libreria utilizzata: http://overpass-api.de/
Qua un sito che fa la stessa cosa della libreria ma da browser: http://overpass-turbo.eu/ (basta che vi spostiate su venezia e runniate
node
[amenity]
({{bbox}});
out;
Attualmente noi stiamo utilizzando la mappa base di OSM.
Ci sono alcune cose che non mi piacciono, in particolare il fatto che alcuni simboli di POI siano mostrati e la maggior parte di questi sono alberghi e b&b.
Propongo di avere una rappresentazione nostra in cui decidiamo noi cosa mostrare e cosa no (ad esempio io proporrei solo nomi strade e fontanelle).
Cercando un po' in internet mi pare di capire che si possano creare i tiles personalizzati usando questo: http://maperitive.net/ oppure possiamo trovare online qualcuno che abbia già dei tiles che ci vadano bene.
Se creiamo i nostri tiles con maperitive possiamo anche utilizzarli direttamente senza doverli ogni volta caricare da OSM (non so però quanto pesino i file)
tutorial o un esempio di cosa si puo fare e come si puo testare
piccoli metodi in utils.py o in un'altra libreria per convertire
Attualmente invece di calcolare il percorso esatto tra due indirizzi, ovvero:
indirizzo A -> indirizzo B
estraiamo dall'indirizzo il nodo più vicino, quindi ora abbiamo:
nodo più vicino a indirizzo A -> nodo più vicino a indirizzo B
find_address_in_db
cerca e ritorna una string che fetch_coordinates
usa. Se find_address_in_db
ritorrnasse l'oggetto, fetch_coordinates
dovrebbe solo estrarre le coordinate e forse non servirebbe neanche usare fetch_coordinates
Gestire meglio alcuni casi, come per esempio:
Cliccare mappa e vedere le coordinate del punto
Se si fa lo zoom al massimo alla fine la mappa scompare.
create a basic page for the project
repr
dovrebbe ritoranre l'oggetto
str
dovrebbe ritornare il nome (per strade e sestiere il nome, per POI nome o un codice predefinito se il POI non ha nome)
get_fancy_description
o chiamiamolo come vogliamo ci da una descrizione completa. Questo viene usato per visualizzare sulla pagina web la cosa trovata o le cose che abbiamo trovato quando non siamo sicuri, quindi piu informazioni possibili
Proporrei di avere gli indirizzi salvati cosi
Sestieri | Area | Toponimo | StopWords | ParolaChiave | NumeriCivici | Coordinate |
---|---|---|---|---|---|---|
Cannaregio | / | Campo San Giovanni e Paolo | Campo, San | Giovanni e Paolo | 3100-3200 | coords |
Cannaregio | / | Barbaria delle Tole | Barbaria | Tole | 3200-3400 | coords |
Santa Croce | Santa Marta | Ponte Santa Marta | Ponte, Santa | Santa Marta | 167-169 | coords |
In modo da avere piu liberta nella ricerca e renderla piu flessibile.
Userei un dizionario, perche numericivici e coordinate sarebbero liste (quindi cerchiamo sempre una strada, ponte, piazza, calle e solo dopo il numero)
Poi magari sarebbe da avere una lista diversa solo per i sestieri
Sesitere | Civici (lista) | Coordinate (lista) |
---|---|---|
Cannaregio | 1-6572 | coordinate |
San Polo | 1-8000 | coordinate |
in modo che se un utente cerca il sestiere, cerchiamo solo il numero
Gli archi hanno un campo lunghezza ma non è chiara l'unità di misura.
Controllare lo shapefile utilizzato, controllare quali sono i campi dello shapefile e come sono stati importati in networkx.
Questa è issue è direttamente collegata al calcolo dei tempi di percorrenza (#13)
sveliamo il mistero del ponte di sant'aponal - e un ponte o un rio tera? cosa dicono le nostre mappe?
creare delle linee guida in github e una sezione nella documentazione che sia leggibile e magari dividere in contenuti tecnici e non tecnici
esempi:
Invece di avere 2 metodi, usiamone uno solo con un argomento facoltativo
Per fare una segnalazione per un problema, quello che a noi aiuta molto sarebbe avere il contesto e gli step per riprodurla.
Informazioni utili:
Data: 23.06.2020, 14:42
Steps:
Piattaforma
telefono
Corretto sarebbe
La mappa mostra la strada da san polo a san marco
Nel caso in cui vogliate proporre una nuova funzionalita, semplicemente descrivere la funzionalita e magari aggiungere un disegno per farci capire come dovrebbe funzionare.
Bar nei dintorni:
mi piacerebbe avere una funzionalita per cui io clicco sulla mappa e la interrogo per sapere se ci sono dei bar nei dintorni, che verranno visualizzati con dei marker sulla mappa. Dovrebbe funzionare sia su telefono e computer con un clic prolungato.
Grazie!
studiare la ricerca asincrona
come funziona mentre l'utente digita sulla barra di ricerca
possiamo gestire il tutto asincrono? pythonanywhere + threads?
2b. asincrona e solo esatta o anche con wuzzy?
wrapper in modo che in routes.py possiamo fare:
POI_vicini = find_POI(X, coordinata, poiCategory, poiCategoryType)
e il metodo faccia
find_POI(X, coordinata, poiCategory, poiCategoryType)
cerchi concentrici che si allargano fino a che non troviamo X POI
return lista con POI, category, categoryType
facendo attenzione che
gestire poligoni invece di una lista di punti
barra a sinistra
gestire lista di indirizzi
vabbe mille cose insomma
La ricerca di fuzzywuzzy ha dei bug importanti con python 3.7 (seatgeek/fuzzywuzzy#216).
Noto ora che la libreria non è aggiornata da un bel po'.
La mia proposta è forkare la libreria da github e metterla a posto per farla funzionare senza errori.
Un piccolo workaround per evitare errori macroscopici è cambiare la funzione di scorer:
> process.extract("Zattere",choices)
[(<Poi(id=1031,name='A',types=['ferry_terminal (amenity)'])>, 90),
(<Poi(id=1515,name='Alle Zattere',types=['restaurant (amenity)', 'italian (cuisine)'])>,
90),
(<Poi(id=1517,name='Alle Zattere',types=['restaurant (amenity)'])>, 90),
(<Poi(id=1802,name='Scuola materne "Isidoro Barbon"',types=['kindergarten (amenity)'])>,
64),
(<Poi(id=1858,name='Latteria 2465',types=['restaurant (amenity)'])>, 64)]
> process.extract("Zattere",choices,scorer=fuzz.token_set_ratio)
[(<Poi(id=1515,name='Alle Zattere',types=['restaurant (amenity)', 'italian (cuisine)'])>,
100),
(<Poi(id=1517,name='Alle Zattere',types=['restaurant (amenity)'])>, 100),
(<Poi(id=1952,name='Santa Teresa',types=['place_of_worship (amenity)', 'church (building)'])>,
63),
(<Poi(id=1509,name='Ai Botteri',types=['restaurant (amenity)', 'italian (cuisine)'])>,
59),
(<Poi(id=2204,name='Panetteria',types=['bakery (shop)'])>, 59)]
> process.extract("Zattere",choices,scorer=fuzz.token_sort_ratio)
[(<Poi(id=1515,name='Alle Zattere',types=['restaurant (amenity)', 'italian (cuisine)'])>,
74),
(<Poi(id=1517,name='Alle Zattere',types=['restaurant (amenity)'])>, 74),
(<Poi(id=1952,name='Santa Teresa',types=['place_of_worship (amenity)', 'church (building)'])>,
63),
(<Poi(id=1509,name='Ai Botteri',types=['restaurant (amenity)', 'italian (cuisine)'])>,
59),
(<Poi(id=2204,name='Panetteria',types=['bakery (shop)'])>, 59)]
> process.extract("Ospedale",choices)
[(<Poi(id=1031,name='A',types=['ferry_terminal (amenity)'])>, 90),
(<Poi(id=1920,name="Chiesa dell'Ospedaletto",types=['place_of_worship (amenity)', 'church (building)'])>,
90),
(<Poi(id=1949,name='Ospedale Giustinian',types=['hospital (amenity)'])>, 90),
(<Poi(id=1470,name='Istituto Ospedaliero Fatebenefratelli',types=['hospital (amenity)'])>,
79),
(<Poi(id=937,name='Cea',types=['restaurant (amenity)'])>, 60)]
> process.extract("Ospedale",choices,scorer=fuzz.token_set_ratio)
[(<Poi(id=1949,name='Ospedale Giustinian',types=['hospital (amenity)'])>, 100),
(<Poi(id=246,name='Posteitaliane',types=['post_office (amenity)'])>, 57),
(<Poi(id=281,name='Salute',types=['ferry_terminal (amenity)'])>, 57),
(<Poi(id=9677,name='Salute',types=['roof (building)'])>, 57),
(<Poi(id=2780,name='Donà Palace',types=['hotel (tourism)'])>, 56)]
> process.extract("Ospedale",choices,scorer=fuzz.token_sort_ratio)
[(<Poi(id=1949,name='Ospedale Giustinian',types=['hospital (amenity)'])>, 59),
(<Poi(id=246,name='Posteitaliane',types=['post_office (amenity)'])>, 57),
(<Poi(id=281,name='Salute',types=['ferry_terminal (amenity)'])>, 57),
(<Poi(id=9677,name='Salute',types=['roof (building)'])>, 57),
(<Poi(id=2780,name='Donà Palace',types=['hotel (tourism)'])>, 56)]
disegna la mappa con colori diveri
Gli shapefile sono molto pesanti e sono utili solo in fase di inizializzazione del database o di creazione del grafo. Il fatto che siano pesanti, oltre a un mio problema personale visto che ho il computer strapieno, è la causa per cui su pythonanywhere abbiamo poco spazio libero. Propongo quindi di eliminare i file dalla repo e, in caso di necessità, scaricarli da una cartella online.
Qua c'è una vecchia cartella condivisa che avevo creato tempo fa, potremmo usare questa o crearne un'altra da un'altra parte: https://mega.nz/folder/ModGiYpT#ga7VXQeAAbGKDejkSX2gpg
creare un file interface.py che gestisce le richieste del sito e le forwarda alle librerie
quindi:
-routes fa solo routing e chiama un metodo di interface con mille flag
-- interface chiama i metodi delle altre librerie che sono
--- library_database (gestione database, update delle tabelle, ecc)
--- library_communication (comunicazione tra python e javascript)
--- library_graph (lavoro sul grafo networkx)
--- library_search (ricerca nel database, fuzzy search eeccetera)
aggiungere una colonna per i punteggi
aggiungere un collegamento one-to-many sestiere --> location
aggiungere i campi nullable per i nomi (e anche per la shape?)
Scrivere una buona funzione di test per poter verificare sempre che il nuovo codice non crei errori su cose pregresse.
La funzione dovrebbe avere dei semplici ma significativi test su database, ricerca, percorso.
Ovviamente la funzione deve essere facilmente implementabile con nuovi test.
Una proposta interessante è creare un'ulteriore funzione che faccia i test prima di ogni push per verificare che non venga pushato del codice con errori. Forse però questo è esagerato e alla fine può addirittura risultare scomodo… da decidere!
TLDR: Cambiare i parametri di trasformazione quando importiamo gli shp file
I dati del comune sono nel sistema di riferimento Monte Mario 2 (EPSG:3004), le mappe di OSM sono invece in WGS84 (EPSG:3857), bisogna quindi fare una trasformazione di coordinate per sovrapporre le coordinate dei dati del coune con la mappa OSM.
La trasformazione di default non è ottimale perché usando noi solo venezia non è ottimizzata per la città
La regione FVG ha modificato leggermente i parametri di trasformazione per ottimizzarli sul territorio del FVG (discussione su google group).
Partendo da quelli del FVG si possono ottimizzare ancora di più per Venezia.
Dopo alcune prove empiriche basate su campo san luca, i parametri che sembrano ottimali per venezia sono:
+proj=tmerc +lat_0=0 +lon_0=15 +k=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +towgs84=-130.5633,-29.2694,-6.12,-1.05572,-2.6951,-2.28808,-16.9352 +units=m +no_defs
Oppure formattati in wkt:
PROJCS["unnamed",GEOGCS["International 1909 (Hayford)",DATUM["unknown",SPHEROID["intl",6378388,297],TOWGS84[-130.5633,-29.2694,-6.12,-1.05572,-2.6951,-2.28808,-16.9352]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",15],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",2520000],PARAMETER["false_northing",0],UNIT["Meter",1]]
Questo il risultato utilizzando la nuova proiezione:
Il tutto sembra quindi risolto, l'unica cosa da fare nel codice è cambiare la trasformazione che effettuiamo sugli shapefile da quella standard a quella con i nuovi parametri.
Riusciamo ad avere un collegamento univoco tra grafo e db? Ogni nodo nel grafo potrebbe avere un ID o un modo per essere ricollegato a un elemento del db, e la stessa cosa vale per gli archi. Ma al momento le cose sono diverse e non sembra cosi facile..
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.