Calculate distance between PLZs if given
This commit is contained in:
parent
853b570f0f
commit
d33e28467b
7 changed files with 716 additions and 472 deletions
|
@ -12,6 +12,7 @@
|
||||||
"doctrine/doctrine-migrations-bundle": "^3.1",
|
"doctrine/doctrine-migrations-bundle": "^3.1",
|
||||||
"doctrine/orm": "^2.8",
|
"doctrine/orm": "^2.8",
|
||||||
"easycorp/easyadmin-bundle": "^3",
|
"easycorp/easyadmin-bundle": "^3",
|
||||||
|
"mjaschen/phpgeo": "^3.2",
|
||||||
"sensio/framework-extra-bundle": "^6.1",
|
"sensio/framework-extra-bundle": "^6.1",
|
||||||
"symfony/asset": "5.2.*",
|
"symfony/asset": "5.2.*",
|
||||||
"symfony/console": "5.2.*",
|
"symfony/console": "5.2.*",
|
||||||
|
|
1097
composer.lock
generated
1097
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -8,6 +8,8 @@ use App\Form\OfferingFormType;
|
||||||
use App\Repository\OfferingRepository;
|
use App\Repository\OfferingRepository;
|
||||||
use App\Repository\WishRepository;
|
use App\Repository\WishRepository;
|
||||||
|
|
||||||
|
use App\Service\PlzToCoordinate;
|
||||||
|
use App\Service\DistanceCalculator;
|
||||||
|
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
@ -73,12 +75,27 @@ class OfferController extends AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/offer/{id}', name: 'show_offer')]
|
#[Route('/offer/{id}', name: 'show_offer')]
|
||||||
public function show_offer(Offering $offer, WishRepository $wishRepository): Response
|
public function show_offer(Offering $offer, WishRepository $wishRepository, PlzToCoordinate $plzconverter, DistanceCalculator $distanceCalculator): Response
|
||||||
{
|
{
|
||||||
|
$distance = 0;
|
||||||
|
$user = $this->getUser();
|
||||||
|
$offerPlz = $offer->getZipCode();
|
||||||
|
|
||||||
|
if (isset($user))
|
||||||
|
{
|
||||||
|
$userPlz = $user->getZipCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($userPlz))
|
||||||
|
{
|
||||||
|
$distance = $distanceCalculator->calculateDistance($plzconverter->getCoordinates($offerPlz), $plzconverter->getCoordinates($userPlz));
|
||||||
|
}
|
||||||
|
|
||||||
return $this->render('app/offer.html.twig', [
|
return $this->render('app/offer.html.twig', [
|
||||||
'user' => $this->getUser(),
|
'user' => $user,
|
||||||
'offer' => $offer,
|
'offer' => $offer,
|
||||||
'wishes' => $wishRepository->findByUser($offer->getByUser()),
|
'wishes' => $wishRepository->findByUser($offer->getByUser()),
|
||||||
|
'distance' => $distance,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
20
src/Service/DistanceCalculator.php
Normal file
20
src/Service/DistanceCalculator.php
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Service;
|
||||||
|
|
||||||
|
use Location\Coordinate;
|
||||||
|
use Location\Distance\Vincenty;
|
||||||
|
|
||||||
|
class DistanceCalculator
|
||||||
|
{
|
||||||
|
public function calculateDistance(Coordinate $coordinate1, Coordinate $coordinate2)
|
||||||
|
{
|
||||||
|
$calculator = new Vincenty();
|
||||||
|
|
||||||
|
$distance = $calculator->getDistance($coordinate1, $coordinate2);
|
||||||
|
|
||||||
|
$distance = round($distance / 1000);
|
||||||
|
|
||||||
|
return $distance;
|
||||||
|
}
|
||||||
|
}
|
20
src/Service/PlzToCoordinate.php
Normal file
20
src/Service/PlzToCoordinate.php
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Service;
|
||||||
|
|
||||||
|
use Location\Coordinate;
|
||||||
|
|
||||||
|
class PlzToCoordinate
|
||||||
|
{
|
||||||
|
public function getCoordinates(int $plz)
|
||||||
|
{
|
||||||
|
$content = file_get_contents("https://swisspost.opendatasoft.com/api/records/1.0/search/?dataset=plz_verzeichnis_v2&q=postleitzahl%3D" . $plz);
|
||||||
|
$result = json_decode($content);
|
||||||
|
|
||||||
|
if (isset($result->records[0]->fields->geo_point_2d[0]) && isset($result->records[0]->fields->geo_point_2d[1])) {
|
||||||
|
$coordinate = new Coordinate($result->records[0]->fields->geo_point_2d[0], $result->records[0]->fields->geo_point_2d[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $coordinate;
|
||||||
|
}
|
||||||
|
}
|
|
@ -106,6 +106,9 @@
|
||||||
"laminas/laminas-zendframework-bridge": {
|
"laminas/laminas-zendframework-bridge": {
|
||||||
"version": "1.2.0"
|
"version": "1.2.0"
|
||||||
},
|
},
|
||||||
|
"mjaschen/phpgeo": {
|
||||||
|
"version": "3.2.1"
|
||||||
|
},
|
||||||
"monolog/monolog": {
|
"monolog/monolog": {
|
||||||
"version": "2.2.0"
|
"version": "2.2.0"
|
||||||
},
|
},
|
||||||
|
@ -342,6 +345,9 @@
|
||||||
"symfony/polyfill-php80": {
|
"symfony/polyfill-php80": {
|
||||||
"version": "v1.22.1"
|
"version": "v1.22.1"
|
||||||
},
|
},
|
||||||
|
"symfony/polyfill-php81": {
|
||||||
|
"version": "v1.23.0"
|
||||||
|
},
|
||||||
"symfony/polyfill-uuid": {
|
"symfony/polyfill-uuid": {
|
||||||
"version": "v1.22.1"
|
"version": "v1.22.1"
|
||||||
},
|
},
|
||||||
|
|
|
@ -17,17 +17,30 @@
|
||||||
<div class="alert alert-info" role="alert">This is your offer!</div>
|
<div class="alert alert-info" role="alert">This is your offer!</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<h1 class="mb-3">{{ offer.title }}</h1>
|
|
||||||
|
|
||||||
<div class="show-offer-container d-flex flex-wrap">
|
<div class="show-offer-container d-flex flex-wrap">
|
||||||
<div class="show-img-container">
|
<div class="show-img-container">
|
||||||
<img class="mb-3 img-fluid rounded" alt="Generic placeholder image" src="{{ asset('uploads/photos/' ~ offer.photofilename) }}">
|
<img class="mb-3 img-fluid rounded" alt="Generic placeholder image" src="{{ asset('uploads/photos/' ~ offer.photofilename) }}">
|
||||||
</div>
|
</div>
|
||||||
<div class="show-offer-info">
|
<div class="show-offer-info w-50">
|
||||||
|
<h1 class="mb-3">{{ offer.title }}</h1>
|
||||||
|
<div class="mb-3 d-flex">
|
||||||
|
<p class="pr-3">
|
||||||
|
<i class="fas fa-user"></i>
|
||||||
|
{% if offer.byUser == user %}
|
||||||
|
Me
|
||||||
|
{% else %}
|
||||||
|
{{ offer.byUser }}
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
<p class="pr-3">
|
||||||
|
<i class="fas fa-map-marker-alt"></i> {{ offer.zipCode }}
|
||||||
|
{% if distance > 0 %}
|
||||||
|
(ca. {{ distance }} km)
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
<h3>Description</h3>
|
<h3>Description</h3>
|
||||||
<p>{{ offer.description }}</p>
|
<p>{{ offer.description }}</p>
|
||||||
<h3>From</h3>
|
|
||||||
<p>{% if offer.byUser == user %}Me{% else %}{{ offer.byUser }}{% endif %} in {{ offer.zipCode }}</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Reference in a new issue