Рубрики

Поиск такси поблизости по формуле Великого кругового расстояния

Учитывая координаты GPS (в градусах) человека, которому требуется такси, и координаты всех такси в городе, хранящихся в текстовом файле в формате JSON, найдите идентификатор пользователя и имя всех драйверов кабины, доступных в 50 км близости.

Примеры:

Input : file customers.json which contains GPS co-ordinates of a person who needs a cab in degrees and co-ordinates of all the cabs in the city stored in a text file in JSON format.

Output : file answers.json which contains user-id and Name of all the cab drivers available in 50 km proximity stored in a new file.

Используемый подход:
1. Получить широту и долготу каждой кабины в формате строки вместе с их
идентификатор пользователя и имя из входного файла в кодировке JSON.

2. Преобразуйте широту и долготу кабины, представленной в строковом формате, в удвоенную.

3. Преобразовать широту и долготу как пользователя, так и кабины, присутствующей в
градусы в радианы.

4. Рассчитайте расстояние между местоположением пользователя и кабиной, используя Great Circle
Формула расстояния.

5. Если окажется, что расстояние меньше или равно 50 км, выведите
идентификатор и имя водителя такси в новый файл, иначе не предпринимать никаких действий.

Процедура запуска программы:
1. Сохраните код и файл customer.json в одном месте.
2. Теперь скомпилируйте код (используя cmd: g ++ имя_файла.cpp ) и запустите его (используя cmd: ./a.out /home/gfg/customers.json ), передав имя файла customer.json вместе с правильным расположением (например, /home/gfg/customers.json).
3. Файл с именем answers.json будет создан в том же месте, где существует код и файл customer.json.

// C ++ код для поиска кабин поблизости
#include <bits/stdc++.h>

using namespace std;

  
// Широта клиента, которому нужна такси.
#define lat1d 12.9611159

  
// Долгота клиента, которому нужна кабина.
#define lon1d 77.6362214

  
#define pi 3.14159265358979323846
#define earth_radius 6371.0

  

ifstream customer_list ("customers.json");

ofstream out ("answer.json");

  
// Функция для преобразования градуса в радианы.

double degtorad(double deg)

{

    return ( deg * pi / 180);

}

  
// Функция для расчета расстояния
// между 2 заданными местоположениями
// используя формулу большого круга

double distanceEarth(double lat2d, double lon2d)

{                 

    double lat1, lon1, lat2, lon2, 

           delta_lon, central_ang;

  

    lat1 = degtorad(lat1d);

    lon1 = degtorad(lon1d);

    lat2 = degtorad(lat2d);

    lon2 = degtorad(lon2d);

  

    delta_lon = lon2 - lon1;

      

    // формула большого круга.

    central_ang = acos ( sin(lat1) *

                  sin(lat2) + cos(lat1) *

                  cos(lat2) * cos(delta_lon) ); 

                    

    return (earth_radius * central_ang);

}

  
// Структура, которая содержит данные и
// функции для доступа и обработки
// данные из указанного файла customer.json.

struct json

{

    / * i и j используются для доступа к различным

    элементы массивов char. х используется

    измерить размер элемента

    массив latitude_as_string. у используется для

    измерить размер элемента

    массив longitude_as_string. м используется

    измерить размер элемента

    массива id_as_string. п используется для

    измерить размер элемента

    массив имен. F ведет подсчет "" "

    символ. fi ведет подсчет символа ":".

    * /

    long long int length, i, j, x, y, m,

                  n, f, fi, id[100000];

      

    char latitude_as_string[1000], 

         longitude_as_string[1000], 

         id_as_string[1000], name[1000];

      

    double lat2d, lon2d;

      

    // Чтобы получить каждую строку customer.json

    // файл в виде строки.

    string line;

  

    // Функция для проверки расстояния между

    // 2 балла меньше 50 км или нет.

    void distance_calculator()

    {

        if (distanceEarth(lat2d, lon2d) <= 50.0000)

        {

            // Преобразование идентификатора в формат int.

            id[i] = atoll(id_as_string);

            i++;

            out << "{\"user_id\": " << id[i - 1] << 

                ", \"name\": " << name << "}" << endl;

        }

    }

  

    // Функция для чтения различных атрибутов

    // как широта, долгота, имя, идентификатор,

    // и т. д. из файла customer.json. упрощенный

    // подход используется для получения атрибутов JSON.

    void json_parser()

    {                     

        if (customer_list.is_open())

        {

              

            while (getline(customer_list, line))

            {

                  

                f = 0; x = 0; y = 0; fi = 0; m = 0, n = 0;

                length = line.size();

  

                for (j = 0; j < length; j++)

                {

                      

                    if (line[j] == '"')

                        f++;

  

                    else if (line[j] == ':')

                        fi++;

                          

                    // Получить широту местоположения.

                    if (f == 3)

                    {

                        j++;

  

                        while (line[j] != '"')

                        {

                            latitude_as_string[x] = line[j];

                            x++; j++;

                        }

  

                        j--; latitude_as_string[x] = '\0';

                    }

                      

                    // Получить долготу местоположения.

                    else if (f == 13)

                    {

                        j++;

  

                        while (line[j] != '"')

                        {

                            longitude_as_string[y] = line[j];

                            y++; j++;

                        }

  

                        j--; longitude_as_string[y] = '\0';

                    }

                      

                    // Получить идентификатор друга.

                    if (fi == 2)

                    {

                        j += 2;

  

                        while (line[j] != ',')

                        {

                            id_as_string[m] = line[j];

                            m++; j++;

                        }

  

                        j--; id_as_string[m] = '\0';

                        fi++;

                    }

                      

                    // Получить имя друга.

                    else if (fi == 4)

                    {

                        j += 2;

  

                        while (line[j] != ',')

                        {

                            name[n] = line[j];

                            n++; j++;

                        }

  

                        j--; name[n] = '\0';

                        fi++; f += 2;

                    }

                }

  

                // Преобразование широты и долготы

                // в строке, чтобы плавать.

                lat2d = atof(latitude_as_string);

                lon2d = atof(longitude_as_string);

                distance_calculator();

            }

        }

          

        // закрываем поток файла клиента.

        customer_list.close();

          

        // закрываем поток файла ответов.

        out.close();

    }

};

  

int main()

{

    // Создание объекта структуры json

    json obj;

      

    // Для чтения файла customer.json.

    obj.json_parser();

    return 0;

}

Входной файл (Customers.json):

{"latitude": "12.986375", "user_id": 12, "name": "Chris", "longitude": "77.043701"}
{"latitude": "11.92893", "user_id": 1, "name": "Alice", "longitude": "78.27699"}
{"latitude": "11.8856167", "user_id": 2, "name": "Ian", "longitude": "78.4240911"}
{"latitude": "12.3191841", "user_id": 3, "name": "Jack", "longitude": "78.5072391"}
{"latitude": "13.807778", "user_id": 28, "name": "Charlie", "longitude": "76.714444"}
{"latitude": "13.4692815", "user_id": 7, "name": "Frank", "longitude": "-9.436036"}
{"latitude": "14.0894797", "user_id": 8, "name": "Eoin", "longitude": "77.18671"}
{"latitude": "13.038056", "user_id": 26, "name": "Stephen", "longitude": "76.613889"}
{"latitude": "14.1225", "user_id": 27, "name": "Enid", "longitude": "78.143333"}
{"latitude": "13.1229599", "user_id": 6, "name": "Theresa", "longitude": "77.2701202"}
{"latitude": "12.2559432", "user_id": 9, "name": "Jack", "longitude": "76.1048927"}
{"latitude": "12.240382", "user_id": 10, "name": "Georgina", "longitude": "77.972413"}
{"latitude": "13.2411022", "user_id": 4, "name": "Ian", "longitude": "77.238335"}
{"latitude": "13.1302756", "user_id": 5, "name": "Nora", "longitude": "77.2397222"}
{"latitude": "13.008769", "user_id": 11, "name": "Richard", "longitude": "77.1056711"}
{"latitude": "13.1489345", "user_id": 31, "name": "Alan", "longitude": "77.8422408"}
{"latitude": "13", "user_id": 13, "name": "Olive", "longitude": "76"}
{"latitude": "11.999447", "user_id": 14, "name": "Helen", "longitude": "-9.742744"}
{"latitude": "12.966", "user_id": 15, "name": "Michael", "longitude": "77.463"}
{"latitude": "12.366037", "user_id": 16, "name": "Ian", "longitude": "78.179118"}
{"latitude": "14.180238", "user_id": 17, "name": "Patricia", "longitude": "-5.920898"}
{"latitude": "13.0033946", "user_id": 39, "name": "Lisa", "longitude": "77.3877505"}
{"latitude": "12.228056", "user_id": 18, "name": "Bob", "longitude": "76.915833"}
{"latitude": "14.133333", "user_id": 24, "name": "Rose", "longitude": "77.433333"}
{"latitude": "55.033", "user_id": 19, "name": "Enid", "longitude": "78.112"}
{"latitude": "13.121111", "user_id": 20, "name": "Enid", "longitude": "-9.831111"}
{"latitude": "11.802", "user_id": 21, "name": "David", "longitude": "-9.442"}
{"latitude": "14.374208", "user_id": 22, "name": "Charlie", "longitude": "78.371639"}
{"latitude": "13.74412", "user_id": 29, "name": "Oliver", "longitude": "76.11167"}
{"latitude": "13.761389", "user_id": 30, "name": "Nick", "longitude": "76.2875"}
{"latitude": "14.080556", "user_id": 23, "name": "Eoin", "longitude": "77.361944"}
{"latitude": "12.833502", "user_id": 25, "name": "David", "longitude": "78.122366"}

Выходной файл (answers.json):

{"user_id": 6, "name": "Theresa"}
{"user_id": 5, "name": "Nora"}
{"user_id": 31, "name": "Alan"}
{"user_id": 15, "name": "Michael"}
{"user_id": 39, "name": "Lisa"}

Ссылка: большое расстояние круга

Рекомендуемые посты:

Поиск такси поблизости по формуле Великого кругового расстояния

0.00 (0%) 0 votes