[Rust] Lire les données csv de latitude et de longitude pour trouver la distance entre deux points

Contexte

Les informations de position d'environ 500 points sont résumées dans les données csv, et je veux trouver la distance linéaire (km) pour toutes les combinaisons.

Trouver la distance depuis la latitude et la longitude

J'ai fait référence à l'article suivant.

--Python Calcul de la distance entre deux points donnés par la longitude et la latitude

pub fn cal_rho(lat_a: &f64, lon_a: &f64, lat_b: &f64, lon_b: &f64) -> f64 {
    const RA: f64 = 6378.140; // equatorial radius (km)
    const RB: f64 = 6356.755; // polar radius (km)
    let f: f64;
    let rad_lat_a: f64;
    let rad_lon_a: f64;
    let rad_lat_b: f64;
    let rad_lon_b: f64;
    let pa: f64;
    let pb: f64;
    let xx: f64;
    let c1: f64;
    let c2: f64;
    let dr: f64;
    let rho: f64;

    f = (RA - RB) / RA;
    rad_lat_a = lat_a.to_radians();
    rad_lon_a = lon_a.to_radians();
    rad_lat_b = lat_b.to_radians();
    rad_lon_b = lon_b.to_radians();
    pa = (RB / RA * rad_lat_a.tan()).atan();
    pb = (RB / RA * rad_lat_b.tan()).atan();
    xx = (pa.sin() * pb.sin() + pa.cos() * pb.cos() * (rad_lon_a - rad_lon_b).cos()).acos();
    c1 = ((xx.sin() - xx) * (pa.sin() + pb.sin())).powf(2.0) / ((xx / 2.0).cos()).powf(2.0);
    c2 = ((xx.sin() + xx) * (pa.sin() - pb.sin())).powf(2.0) / ((xx / 2.0).sin()).powf(2.0);
    dr = f / 8.0 * (c1 - c2);
    rho = RA * (xx + dr);
    rho
}

Charger csv-> Calculer la distance

J'ai essayé de créer une boucle imbriquée en utilisant StringRecordsIter, qui peut être obtenue avec rdr.records (), mais cela n'a pas fonctionné. Par conséquent, il a été converti en ʻIter-> Vec`.

extern crate csv;
use csv::StringRecord;
use std::env;
use std::error::Error;
use std::ffi::OsString;
use std::fs::File;

pub fn run() -> Result<(), Box<Error>> {
    let file_path = "file.csv";
    let file = File::open(file_path)?;
    let mut rdr = csv::Reader::from_reader(file);
    let _records = rdr.records();
    let records: Vec<StringRecord> = _records.map(|x| x.unwrap()).collect();
    let data_len = &records.len();
    
    for i in 0..*data_len {
        for j in 0..*data_len {
            let r_i = &records[i];
            let lat_i = &r_i[1];
            let lat_i: f64 = lat_i.parse().unwrap();
            let lng_i = &r_i[2];
            let lng_i: f64 = lng_i.parse().unwrap();
            let r_j = &records[j];
            let lat_j = &r_j[1];
            let lat_j: f64 = lat_j.parse().unwrap();
            let lng_j = &r_j[2];
            let lng_j: f64 = lng_j.parse().unwrap();

            let dist = cal_rho(&lat_i, &lng_i, &lat_j, &lng_j);

            println!("{}", dist);
        }
    }
    Ok(())
}

C'est une mise en œuvre maladroite, donc s'il y a un bon moyen, j'aimerais avoir de vos nouvelles.

Recommended Posts

[Rust] Lire les données csv de latitude et de longitude pour trouver la distance entre deux points
Trouvez la distance (en tenant compte de la rondeur de la terre) de la latitude et de la longitude.
Distance approximative entre deux points à la surface d'un ellipsoïde en rotation (à la surface de la terre)
Donnez les données de séquence de points de latitude et de longitude et essayez d'identifier la route à partir des données d'OpenStreetMap
Coloration des points en fonction de la distance de la courbe de régression
Python --Lisez des données à partir d'un fichier de données numériques pour trouver des matrices, des valeurs propres et des vecteurs propres distribués co-distribués
Ecrire un programme python pour trouver la distance d'édition [python] [distance Levenshtein]
Différentes façons de calculer la similitude entre les données avec python
[Introduction à matplotlib] Lire l'heure de fin à partir des données COVID-19 ♬