Автомобилен калкулатор за изчисляване на от А до Б

emcuemnecu

Registered
Здравейте.. Някой може ли да ми помогне за направата на скрипт, който да изчислява разстоянието от град до град и колко гориво ще изразходи ако цената е 2.60 за литър и му харчи примерно 8 на 100?
 
emcuemnecu каза:
Здравейте.. Някой може ли да ми помогне за направата на скрипт, който да изчислява разстоянието от град до град и колко гориво ще изразходи ако цената е 2.60 за литър и му харчи примерно 8 на 100?
Ам... как ще разбираш разстаоянието до градовете не знам...
Иначе ако го имаш записано някаде и някой избере
Пловдив-Бургас = 300км

Вивеждаш в една кутийка че колата му харчи 10 за 100км ( въвежда се от потребителя)

взимаш я тази стойност ,делиш я на 100(за 100км) в нашия случай 10/100 = 0.1 и умножаваш по разстоянието (в нашия случай = 300)
0.1*300=30литра

след като получиш колко литра са , просто ги умножи по цената нa горивото в твоя случай 2.6
30*2.6=78


edit:За км-итре между градовете виж:ТУК
 
Това ще ти помогне много.
http://architects.dzone.com/articles/algorithm-week-prims-minimum
 
Основния проблем в случая е да се определи разстоянието между началната и крайната точка. И то не просто разстоянието между две точки на картата, а разстоянието по пътищата между двете точки. Вариантите за това са няколко:

1. Потребителя сам въвежда разстоянието. Едва ли искаш това.

2. Ти разполагаш от някъде с някакъв огромен списък с възможни начални и крайни точки, да кажем само между по-големите градове в България. Едва ли го имаш.

3. Да използваш услуга като Google Maps, и по-точно DistanceMatrix API. В този случай обаче задължително трябва да показваш картата на Гугъл, иначе нямаш право да използваш услугата.

Ето тук има един вариант на Javascript. Би могло да се направи и решение на РНР чрез Google Maps API Web Services - The Google Distance Matrix API
 
PHP:
<?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>
 
Изчислете разстоянието тук е най-добрият пример за вас
калкулатор на разстоянията, които видях - http://mapszoom.com/razstojanieto/
 

Горе