Domanda Python calcolare distanza tra città con Geopy

caroliinamontini

Utente Iron
12 Gennaio 2023
2
1
0
2
Ultima modifica:
Urgente: ho un codice che dato un testo estrapola i nomi delle città e ne permette la visualizzazione su mappa (utilizzato geopy e folium). Sempre con geopy ora devo memorizzare le località che trova nel testo in una lista (quindi preservando l’ordine in cui vengono trovate nel testo) e calcolare la distanza tra un elemento della lista e il precedente. Come posso fare? Help

Codice:
testo = open("Testo.txt", mode="r", encoding="UTF-8")
print(testo)

pip install geopy

pip install geopy locationtagger

import nltk
import spacy

import locationtagger
testo = open("Testo.txt", mode="r", encoding="UTF-8")
testor = testo.read()
place_entity = locationtagger.find_locations(text = testor)
print ("Città nel testo:", place_entity.cities)

import csv
listaCitta = place_entity.cities
with open("Citta.csv", "w", newline="") as Citta:
  fieldnames = ["Citta"]
  writer = csv.DictWriter(Citta, fieldnames=fieldnames)
  writer.writeheader()
  for element in listaCitta:
    writer.writerow({"Citta":element})

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent = "Mappa", timeout = 2)

import pandas as pd #Importiamo la libreria Pandas con l'alias "pd"
pd.set_option("max_rows", 400)
pd.set_option("max_colwidth", 400)
def find_location(row):
  Citta = row["Citta"]
  location = geolocator.geocode(Citta)
  if location != None:
    print(location.address, location.latitude, location.longitude)
    return(location.address, location.latitude, location.longitude)
  else:
    return "Not Found", "Not Found", "Not Found"
Citta = pd.read_csv("Citta.csv")
Citta[["address", "lat", "lon"]] = Citta.apply(find_location, axis="columns", result_type="expand")
print(Citta)

import folium
map = folium.Map([39.571625, 2.650544], zoom_start=3)

def create_markers(row, map_name):
  folium.Marker(location=[row["lat"], row["lon"]], popup=row["Citta"]).add_to(map_name)
found_locations = Citta[Citta["address"] != "Not Found"]
found_locations.apply(create_markers, map_name = map, axis = "columns")
map

from geopy import distance
location1 = geolocator.geocode("Valencia")
location2 = geolocator.geocode("Pamplona")
a=(location1.latitude, location1.longitude)
b=(location2.latitude, location2.longitude)
print("La distanza tra Valencia e Pamplona è di:")
print((distance.distance(a, b).km), "km")
 
Urgente: ho un codice che dato un testo estrapola i nomi delle città e ne permette la visualizzazione su mappa (utilizzato geopy e folium). Sempre con geopy ora devo memorizzare le località che trova nel testo in una lista (quindi preservando l’ordine in cui vengono trovate nel testo) e calcolare la distanza tra un elemento della lista e il precedente. Come posso fare? Help
Posta il codice che hai iniziato a scrivere, anche se ci sono errori, perché devi dimostrare che almeno hai provato a fare qualcosa. Non ci piace fare i compiti agli altri su questo forum. Ti aiuteremo volentieri se posti la tua soluzione. 😉
 
  • Mi piace
Reazioni: caroliinamontini
Ultima modifica:
Ciao, posta qui il tuo codice così da poter aiutarti utilizza [ CODE] *scrivi il codice* [/ CODE] (senza gli spazi tra i tag ovviamente) cosi diventa più ordinato e facile per aiutarti
Codice:
testo = open("Testo.txt", mode="r", encoding="UTF-8")
print(testo)

pip install geopy

pip install geopy locationtagger

import nltk
import spacy

import locationtagger
testo = open("Testo.txt", mode="r", encoding="UTF-8")
testor = testo.read()
place_entity = locationtagger.find_locations(text = testor)
print ("Città nel testo:", place_entity.cities)

import csv
listaCitta = place_entity.cities
with open("Citta.csv", "w", newline="") as Citta:
  fieldnames = ["Citta"]
  writer = csv.DictWriter(Citta, fieldnames=fieldnames)
  writer.writeheader()
  for element in listaCitta:
    writer.writerow({"Citta":element})

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent = "Mappa", timeout = 2)

import pandas as pd #Importiamo la libreria Pandas con l'alias "pd"
pd.set_option("max_rows", 400)
pd.set_option("max_colwidth", 400)
def find_location(row):
  Citta = row["Citta"]
  location = geolocator.geocode(Citta)
  if location != None:
    print(location.address, location.latitude, location.longitude)
    return(location.address, location.latitude, location.longitude)
  else:
    return "Not Found", "Not Found", "Not Found"
Citta = pd.read_csv("Citta.csv")
Citta[["address", "lat", "lon"]] = Citta.apply(find_location, axis="columns", result_type="expand")
print(Citta)

import folium
map = folium.Map([39.571625, 2.650544], zoom_start=3)

def create_markers(row, map_name):
  folium.Marker(location=[row["lat"], row["lon"]], popup=row["Citta"]).add_to(map_name)
found_locations = Citta[Citta["address"] != "Not Found"]
found_locations.apply(create_markers, map_name = map, axis = "columns")
map

from geopy import distance
location1 = geolocator.geocode("Valencia")
location2 = geolocator.geocode("Pamplona")
a=(location1.latitude, location1.longitude)
b=(location2.latitude, location2.longitude)
print("La distanza tra Valencia e Pamplona è di:")
print((distance.distance(a, b).km), "km")
Messaggio unito automaticamente:

Posta il codice che hai iniziato a scrivere, anche se ci sono errori, perché devi dimostrare che almeno hai provato a fare qualcosa. Non ci piace fare i compiti agli altri su questo forum. Ti aiuteremo volentieri se posti la tua soluzione. 😉
Fatto! Grazie e scusate sto ancora imparando...
 
È ancora tutto un po' caotico. Ti consiglio di utilizzare, se sei da computer, l'apposita funzione dell'editor di testo per postare il codice sul forum: il simbolo è quello delle parentesi angolari. Da lì, poi, scegli il linguaggio con cui scrivere il codice. Questa funzione è comoda perché attiva l'evidenziazione della sintassi per ogni specifico linguaggio, proprio come fanno gli IDE. Rimuovi tutti i comandi che riguardano l'installazione dei moduli Python (per capirci "pip install") perché peggiorano la leggibilità e non fanno parte del codice. Tutti gli import mettili all'inizio del programma in un unico blocco. Dopo scrivi tutte le funzioni e infine il programma vero e proprio, chiamando in modo sequenziale le funzioni progettate. La strategia che devi seguire, approssimativamente, è questa:
1) Ricavare i nomi delle città dal file di testo e inserirli in una lista delle città
2) Iterare sugli elementi della lista a due a due calcolando le distanze tra le città e inserendole di volta in volta, per preservare l'ordine, in una seconda lista o dizionario che andrai a creare per le distanze .
Hai letto bene la documentazione delle librerie che vuoi usare? Ci sono metodi che ti permettono di svolgere alcune operazioni senza che debba implementarle tu? Facci sapere.