emcuemnecu
Registered
Здравейте.. Някой може ли да ми помогне за направата на скрипт, който да изчислява разстоянието от град до град и колко гориво ще изразходи ако цената е 2.60 за литър и му харчи примерно 8 на 100?
Ам... как ще разбираш разстаоянието до градовете не знам...emcuemnecu каза:Здравейте.. Някой може ли да ми помогне за направата на скрипт, който да изчислява разстоянието от град до град и колко гориво ще изразходи ако цената е 2.60 за литър и му харчи примерно 8 на 100?
<?php
/**
* Калкулация на маршрут
*
* При зададени параметри за разходна норма, цена на горивото, начална и крайна точка,
* остойностява разхода и предоставя допълнителна информация за маршрута.
*
* Използва {@link https://developers.google.com/maps/documentation/distancematrix/ Google Distance Matrix API}
* за изчисляване на разстоянието.
*/
class RouteCaclulator
{
public $base_url = 'http://maps.googleapis.com/maps/api/distancematrix/json';
public $sensor = false;
public $mode = 'driving';
public $language = 'BG';
public $region = 'BG';
/**
* Адрес на началната точка на маршрута
* @var string
*/
private $origin;
/**
* Адрес на крайната точка на маршрута
* @var string
*/
private $destination;
/**
* Разходна норма в литри на сто километра
* @var decimal
*/
private $fuel_rate;
/**
* Цена на горивото в лева за литър
* @var decimal
*/
private $fuel_price;
/**
* Отговора, който получаваме от Google Distance Matrix API
* @var string JSON-encoded обект
*/
private $_response;
/**
* Съобщение за грешка, когато не е въведена разходна норма
*/
const ERROR_NO_FUEL_RATE = 'Въведете разходна норма в литри на 100 км.';
/**
* Съобщение за грешка, когато не е въведена цена на горивото
*/
const ERROR_NO_FUEL_PRICE = 'Въведете цена на горивото в лева за 1 литър';
/**
* HTTP GET request
*
* Изключително елементарен вариант на HTTP GET заявка към Google Distance Matrix API.
* Необходимо е allow_url_fopen да бъде true
*
* @throws Exception
* @return RouteCalculator
*/
public function get()
{
//Създаване на пълния URL за заявката
$full_url = $this->_build_request_url();
//Изпращане на заявката и прочитане на отговора
$response = file_get_contents($full_url);
//Трансформиране на отговора от JSON-encoded string към обект
$this->_response = json_decode($response);
//В случай на грешка - throws exception
if($this->_response->status != 'OK'){
throw new Exception($this->_response->status);
}
return $this;
}
/**
* Калкулира цената на маршрута
*
* Метода работи само при наличен валиден отговор от
* Google Distance Matrix API и валидни данни за
* разхода и цената на гориво.
*
* @return string Цена на маршрута във формат "ЛВ.СТ"
*/
public function calculatePrice()
{
if($this->_response && $this->_validFuelData())
{
return number_format(
round(($this->_response->rows[0]->elements[0]->distance->value/1000/100) * $this->fuel_rate * $this->fuel_price, 2),
2
);
}
}
/**
* Дистанция
*
* Стойноста на дистанцията между началната и крайната
* точки, използвана при калкулирането на цената на маршрута.
*
* @return decimal
*/
public function getDistance()
{
if($this->_response)
{
return $this->_response->rows[0]->elements[0]->distance->value/1000;
}
}
public function setOrigin($name)
{
$this->origin = $this->_filterCity($name);
return $this;
}
public function setDestination($name)
{
$this->destination = $this->_filterCity($name);
return $this;
}
public function setFuelRate($fuel_rate)
{
$this->fuel_rate = $this->_filterDigit($fuel_rate);
return $this;
}
public function setFuelPrice($fuel_price)
{
$this->fuel_price = $this->_filterDigit($fuel_price);
return $this;
}
private function _build_request_url()
{
$this->destination = $this->_filterCity($this->destination);
return $this->base_url.'?sensor='.var_export($this->sensor, true).'&'
.'origins='.urlencode($this->origin).'&'
.'destinations='.urlencode($this->destination).'&'
.'mode='.$this->mode.'&'
.'language='.$this->language.'&'
.'region='.$this->region;
}
private function _validFuelData()
{
if(empty($this->fuel_rate))
{
throw new Exception(self::ERROR_NO_FUEL_RATE);
}
elseif(empty($this->fuel_price))
{
throw new Exception(self::ERROR_NO_FUEL_PRICE);
}else{
return true;
}
}
private function _filterCity($name)
{
if(strstr($name, ',') !== false){
$name = array_shift(explode(',', $name));
}
return $name;
}
private function _filterDigit($num)
{
if(preg_match('/^(\d+)\,(\d+)$/', $num)){
$num = preg_replace('/,/', '.', $num);
}
return $num;
}
}
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$route = new RouteCaclulator();
$route->setOrigin($_POST['origin'])
->setDestination($_POST['destination'])
->setFuelRate($_POST['fuel_rate'])
->setFuelPrice($_POST['fuel_price']);
try{
$route->get();
$price = $route->calculatePrice();
$distance = $route->getDistance();
}catch(Exception $e){
$error = $e->getMessage();
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Distance Matrix service</title>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places"></script>
<script>
function initialize() {
var autocompleteOptions = {
types: ['(cities)'],
componentRestrictions: {country: 'bg'}
}
new google.maps.places.Autocomplete(
document.getElementById('origin'),
autocompleteOptions
);
new google.maps.places.Autocomplete(
document.getElementById('destination'),
autocompleteOptions
);
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<?php if($error){ ?>
<h3><?php echo $error; ?></h3>
<?php } ?>
<form method="post">
<fieldset>
<p>
<label>Разход в литри на 100 км.</label>
<input type="text" name="fuel_rate" size="5" value="<?php echo $_POST['fuel_rate']; ?>">
</p>
<p>
<label>Цена за 1 литър:</label>
<input type="text" name="fuel_price" size="5" value="<?php echo $_POST['fuel_price']; ?>">
</p>
<p>
<label>Маршрут от:</label>
<input type="text" name="origin" id="origin" value="<?php echo $_POST['origin']; ?>">
<label> до </label>
<input type="text" name="destination" id="destination" value="<?php echo $_POST['destination']; ?>">
</p>
<p><input type="submit" value="Изчисли" /></p>
<?php if($price && $distance){ ?>
<p>Цена: <?php echo $price; ?> лв., разстояние: <?php echo $distance; ?> км.</p>
<?php } ?>
</fieldset>
</form>
</body>
</html>