Covivo/mobicoop

View on GitHub
api/src/Controller/GeoRouterController.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

/**
 * Copyright (c) 2018, MOBICOOP. All rights reserved.
 * This project is dual licensed under AGPL and proprietary licence.
 ***************************
 *    This program is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU Affero General Public License as
 *    published by the Free Software Foundation, either version 3 of the
 *    License, or (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU Affero General Public License for more details.
 *
 *    You should have received a copy of the GNU Affero General Public License
 *    along with this program.  If not, see <gnu.org/licenses>.
 ***************************
 *    Licence MOBICOOP described in the file
 *    LICENSE
 **************************/

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Geography\Service\GeoRouter;
use App\Geography\Entity\Address;
use App\Geography\Service\ZoneManager;

/**
 * FOR TESTING PURPOSE ONLY
 *
 * Test of GeoRouter services.
 *
 * @author Sylvain Briat <sylvain.briat@mobicoop.org>
 *
 */
class GeoRouterController extends AbstractController
{
    /**
     * @Route("/georouter")
     */
    public function test(GeoRouter $geoRouter)
    {
        // test paris => nancy // reims => verdun
        $address1 = new Address(1);
        $address1->setLatitude(48.892523);
        $address1->setLongitude(2.367379);
        $address2 = new Address(2);
        $address2->setLatitude(48.699873);
        $address2->setLongitude(6.174560);
        $address3 = new Address(3);
        $address3->setLatitude(49.248909);
        $address3->setLongitude(4.037836);
        $address4 = new Address(4);
        $address4->setLatitude(48.755365);
        $address4->setLongitude(5.588119);
        $address5 = new Address(5);
        $address5->setLatitude(49.548909);
        $address5->setLongitude(4.137836);
        $address6 = new Address(6);
        $address6->setLatitude(49.181491);
        $address6->setLongitude(5.695852);

        $address7 = new Address(3);
        $address7->setLatitude(49.248909);
        $address7->setLongitude(4.037836);
        $address8 = new Address(4);
        $address8->setLatitude(48.755365);
        $address8->setLongitude(5.588119);
        $address9 = new Address(5);
        $address9->setLatitude(49.548909);
        $address9->setLongitude(4.137836);
        $address10 = new Address(6);
        $address10->setLatitude(49.181491);
        $address10->setLongitude(5.695852);
        
        $address11 = new Address(3);
        $address11->setLatitude(49.248909);
        $address11->setLongitude(4.037836);
        $address12 = new Address(4);
        $address12->setLatitude(48.755365);
        $address12->setLongitude(5.588119);
        $address13 = new Address(5);
        $address13->setLatitude(49.548909);
        $address13->setLongitude(4.137836);
        $address14 = new Address(6);
        $address14->setLatitude(49.181491);
        $address14->setLongitude(5.695852);

        // nancy metz
        $address15 = new Address(15);
        $address15->setLatitude(48.693900);
        $address15->setLongitude(6.178986);

        $address16 = new Address(16);
        $address16->setLatitude(49.120602);
        $address16->setLongitude(6.174711);

        // hambourg séville
        $address17 = new Address(17);
        $address17->setLatitude(53.50900);
        $address17->setLongitude(9.999634);

        $address18 = new Address(18);
        $address18->setLatitude(37.268897);
        $address18->setLongitude(-5.682345);

        $addresses1 = [
            $address1,
            $address2
        ];
        
        $addresses2 = [
            $address1,
            $address3,
            $address4,
            $address2
        ];
        
        $addresses3 = [
            $address1,
            $address5,
            $address6,
            $address2
        ];

        $addresses4 = [
            $address1,
            $address7,
            $address8,
            $address2
        ];
        
        $addresses5 = [
            $address1,
            $address9,
            $address10,
            $address2
        ];
        
        $addresses6 = [
            $address1,
            $address11,
            $address12,
            $address2
        ];

        $addresses7 = [
            $address1,
            $address13,
            $address14,
            $address2
        ];

        $addresses8 = [
            $address15,
            $address16
        ];

        $addresses9 = [
            $address17,
            $address18
        ];

        $addressespool = [
            $address15,
            $address16,
            $address17,
            $address18
        ];
        $addresses100 = [];


        for ($i=1;$i<=50;$i++) {
            $addresses100[] = $addressespool[rand(0, count($addressespool)-1)];
        }

        $start = microtime(true);
        $routes8 = $geoRouter->getRoutes($addresses100);
        $time_elapsed_secs = microtime(true) - $start;
        
        /*$route1 = $routes1[0];
        $route2 = $routes2[0];
        $route3 = $routes3[0];
        $route4 = $routes4[0];
        $route5 = $routes5[0];
        $route6 = $routes6[0];
        $route7 = $routes7[0];*/
        $route8 = $routes8[0];
        
        /*$duration1 = $route1->getDuration()/1000/60;
        $duration2 = $route2->getDuration()/1000/60;
        $duration3 = $route3->getDuration()/1000/60;
        $duration4 = $route4->getDuration()/1000/60;
        $duration5 = $route5->getDuration()/1000/60;
        $duration6 = $route6->getDuration()/1000/60;
        $duration7 = $route7->getDuration()/1000/60;*/
        $duration8 = $route8->getDuration()/1000/60;

        /*$distance1 = $route1->getDistance()/1000;
        $distance2 = $route2->getDistance()/1000;
        $distance3 = $route3->getDistance()/1000;
        $distance4 = $route4->getDistance()/1000;
        $distance5 = $route5->getDistance()/1000;
        $distance6 = $route6->getDistance()/1000;
        $distance7 = $route7->getDistance()/1000;*/
        $distance8 = $route8->getDistance()/1000;

        
        //echo "Route 1 // duration = $duration1 minutes, distance = $distance1 kms<br />";
        /*foreach ($route1->getWaypoints() as $waypoint) {
            echo $waypoint ->getLatitude() . ", " . $waypoint->getLongitude() . "<br />";
        }*/
        //echo "<pre>" . print_r($route1->getPoints(),true) . "</pre>";
        //echo "Route 2 // duration = $duration2 minutes, distance = $distance2 kms<br />";
        /*foreach ($route2->getWaypoints() as $waypoint) {
            echo $waypoint ->getLatitude() . ", " . $waypoint->getLongitude() . "<br />";
        }*/
        //echo "Route 3 // duration = $duration3 minutes, distance = $distance3 kms<br />";
        /*foreach ($route3->getWaypoints() as $waypoint) {
            echo $waypoint ->getLatitude() . ", " . $waypoint->getLongitude() . "<br />";
        }*/
        //echo "Route 4 // duration = $duration4 minutes, distance = $distance4 kms<br />";
        /*foreach ($route4->getWaypoints() as $waypoint) {
            echo $waypoint ->getLatitude() . ", " . $waypoint->getLongitude() . "<br />";
        }*/
        //echo "Route 5 // duration = $duration5 minutes, distance = $distance5 kms<br />";
        /*foreach ($route5->getWaypoints() as $waypoint) {
            echo $waypoint ->getLatitude() . ", " . $waypoint->getLongitude() . "<br />";
        }*/
        //echo "Route 6 // duration = $duration6 minutes, distance = $distance6 kms<br />";
        /*foreach ($route6->getWaypoints() as $waypoint) {
            echo $waypoint ->getLatitude() . ", " . $waypoint->getLongitude() . "<br />";
        }*/
        //echo "Route 7 // duration = $duration7 minutes, distance = $distance7 kms<br />";
        /*foreach ($route7->getWaypoints() as $waypoint) {
            echo $waypoint ->getLatitude() . ", " . $waypoint->getLongitude() . "<br />";
        }*/
        echo "Route 8 // duration = $duration8 minutes, distance = $distance8 kms<br />";
        /*foreach ($route7->getWaypoints() as $waypoint) {
            echo $waypoint ->getLatitude() . ", " . $waypoint->getLongitude() . "<br />";
        }*/
        echo "Calculation duration = $time_elapsed_secs s";
        exit;
    }
    
    /**
     * @Route("/georouter/zones")
     */
    public function zones(GeoRouter $geoRouter, ZoneManager $zoneManager)
    {
        // test paris => nancy // reims => verdun
        $address1 = new Address(1);
        $address1->setLatitude(48.45523);
        $address1->setLongitude(2.367379);
        $address2 = new Address(2);
        $address2->setLatitude(48.89873);
        $address2->setLongitude(6.174560);
        $address3 = new Address(3);
        $address3->setLatitude(49.12909);
        $address3->setLongitude(4.037836);
        $address4 = new Address(4);
        $address4->setLatitude(48.45365);
        $address4->setLongitude(5.588119);
        
        $addresses1 = [
            $address1,
            $address2
        ];
        
        $addresses2 = [
            $address1,
            $address3,
            $address4,
            $address2
        ];
        
        $start = microtime(true);
        $routes1 = $geoRouter->getRoutes($addresses1);
        $routes2 = $geoRouter->getRoutes($addresses2);
        
        
        $route1 = $routes1[0];
        $route2 = $routes2[0];
        
        $duration1 = $route1->getTime()/1000/60;
        $duration2 = $route2->getTime()/1000/60;
        
        $distance1 = $route1->getDistance()/1000;
        $distance2 = $route2->getDistance()/1000;
        
        $zones1 = $zoneManager->getZonesForAddresses($route1->getPoints());
        $zones2 = $zoneManager->getZonesForAddresses($route1->getPoints(), 1);
        
        $time_elapsed_secs = microtime(true) - $start;
        
        echo "Route 1 // duration = $duration1 minutes, distance = $distance1 kms<br />";
        echo "Zones 1 // <br />";
        foreach ($zones1 as $zone) {
            echo $zone . " - ";
        }
        echo "<br />";
        echo "Route 2 // duration = $duration2 minutes, distance = $distance2 kms<br />";
        echo "Zones 2 and near zones // <br />";
        foreach ($zones2 as $zone) {
            echo $zone . " - ";
        }
        echo "<br />";
        echo "Calculation duration = $time_elapsed_secs s";
        exit;
    }
}