| 1 | <?php
|
|---|
| 2 |
|
|---|
| 3 | class MapOSM extends Map
|
|---|
| 4 | {
|
|---|
| 5 | private array $Points;
|
|---|
| 6 |
|
|---|
| 7 | function Geolocate($Text)
|
|---|
| 8 | {
|
|---|
| 9 | // http://wiki.openstreetmap.org/wiki/Nominatim
|
|---|
| 10 | $URL = 'http://nominatim.openstreetmap.org/search.php?q='.urlencode($Text).'&viewbox=&format=xml&limit=1';
|
|---|
| 11 | $Result = file_get_contents($URL);
|
|---|
| 12 | $Result = substr($Result, strpos($Result, 'boundingbox="') + 13);
|
|---|
| 13 | $BoundingBox = substr($Result, 0, strpos($Result, '"') - 1);
|
|---|
| 14 | $Parts = explode(',', $BoundingBox);
|
|---|
| 15 | $Zoom = 1 / ($Parts[1] - $Parts[0]) * 2;
|
|---|
| 16 | $Result = substr($Result, strpos($Result, 'lat=\'') + 5);
|
|---|
| 17 | $Latitude = substr($Result, 0, strpos($Result, '\'') - 1);
|
|---|
| 18 | $Result = substr($Result, strpos($Result, 'lon=\'') + 5);
|
|---|
| 19 | $Longitude = substr($Result, 0, strpos($Result, '\'') - 1);
|
|---|
| 20 | return array('Latitude' => $Latitude, 'Longitude' => $Longitude, 'BoundingBox' => $BoundingBox, 'Zoom' => $Zoom);
|
|---|
| 21 | }
|
|---|
| 22 |
|
|---|
| 23 | function Route($TextPathItems)
|
|---|
| 24 | {
|
|---|
| 25 | $this->Points = array();
|
|---|
| 26 | foreach ($TextPathItems as $TextPathItem)
|
|---|
| 27 | {
|
|---|
| 28 | $Result = $this->Geolocate($TextPathItem);
|
|---|
| 29 | $this->Points[] = array('Longitude' => $Result['Longitude'],
|
|---|
| 30 | 'Latitude' => $Result['Latitude']);
|
|---|
| 31 | }
|
|---|
| 32 |
|
|---|
| 33 | $WayPoints = array();
|
|---|
| 34 | foreach ($this->Points as $Point)
|
|---|
| 35 | {
|
|---|
| 36 | $WayPoints[] = $Point['Longitude'];
|
|---|
| 37 | $WayPoints[] = $Point['Latitude'];
|
|---|
| 38 | }
|
|---|
| 39 |
|
|---|
| 40 | // http://wiki.openstreetmap.org/wiki/OpenRouteService#OpenRouteService_API
|
|---|
| 41 | $this->Key = 'ee0b8233adff52ce9fd6afc2a2859a28';
|
|---|
| 42 | $URL = 'http://openls.geog.uni-heidelberg.de/route?api_key='.
|
|---|
| 43 | $this->Key.'&start='.implode(',', $this->Points[0]).'&end='.implode(',', $this->Points[count($this->Points) - 1]).
|
|---|
| 44 | '&via='.implode(',', $WayPoints).'&lang=en&distunit=M&routepref=Car&weighting=Fastest&avoidAreas='.
|
|---|
| 45 | '&useTMC=false&noMotorways=false&noTollways=false&noUnpavedroads=false&noSteps=false'.
|
|---|
| 46 | '&noFerries=false&elevation=false&surface=false&instructions=false';
|
|---|
| 47 | $Result = file_get_contents($URL);
|
|---|
| 48 | echo($Result);
|
|---|
| 49 | $Separator = '<xls:TotalDistance uom="M" value="';
|
|---|
| 50 | $Result = substr($Result, strpos($Result, $Separator) + strlen($Separator));
|
|---|
| 51 | $TotalDistance = substr($Result, 0, strpos($Result, '"/>') - 1);
|
|---|
| 52 | $Separator = '<xls:TotalTime>PT2H3M48S';
|
|---|
| 53 | $Result = substr($Result, strpos($Result, $Separator) + strlen($Separator));
|
|---|
| 54 | $TotalTime = substr($Result, 0, strpos($Result, '"/>') - 1);
|
|---|
| 55 |
|
|---|
| 56 | $Points = array();
|
|---|
| 57 | $Separator = '<gml:pos>';
|
|---|
| 58 | while (strpos($Result, $Separator) !== false)
|
|---|
| 59 | {
|
|---|
| 60 | $Result = substr($Result, strpos($Result, $Separator) + strlen($Separator));
|
|---|
| 61 | $Pos = substr($Result, 0, strpos($Result, '</gml:pos>') - 1);
|
|---|
| 62 | $PosParts = explode(' ', $Pos);
|
|---|
| 63 | $Points[] = array('Longitude' => $PosParts[0], 'Latitude' => $PosParts[1]);
|
|---|
| 64 | }
|
|---|
| 65 | return array('TotalDistance' => $TotalDistance, 'TotalTime' => $TotalTime,
|
|---|
| 66 | 'Points' => $Points);
|
|---|
| 67 | }
|
|---|
| 68 |
|
|---|
| 69 | function Show()
|
|---|
| 70 | {
|
|---|
| 71 | $WayPoints = array();
|
|---|
| 72 | foreach ($this->Points as $Point)
|
|---|
| 73 | {
|
|---|
| 74 | $WayPoints[] = $Point['Longitude'];
|
|---|
| 75 | $WayPoints[] = $Point['Latitude'];
|
|---|
| 76 | }
|
|---|
| 77 |
|
|---|
| 78 | $Output = '<iframe width="'.$this->Width.'" height="'.$this->Height.'" frameborder="0" scrolling="no" '.
|
|---|
| 79 | 'marginheight="0" marginwidth="0" src="'.
|
|---|
| 80 | 'http://www.openrouteservice.org/?pos=8.925670599999979,52.28150333376007&zoom='.
|
|---|
| 81 | $this->Zoom.'&layer=0B00&routeOpt=Car&wp='.implode(',', $WayPoints).
|
|---|
| 82 | '&lang=en&routeLang=en&distUnit=m&routeWeight=Fastest'.
|
|---|
| 83 | 'style="border: 1px solid black"></iframe>';
|
|---|
| 84 | /* $Latitude = $this->Pos['Latitude'];
|
|---|
| 85 | $Longitude = $this->Pos['Longitude'];
|
|---|
| 86 | $Zoom = $this->Zoom;
|
|---|
| 87 | $BoundingBox = array($Longitude - 1 / $Zoom, $Latitude - 1 / $Zoom, $Longitude + 1 / $Zoom, $Latitude + 1 / $Zoom);
|
|---|
| 88 | $Output = '<iframe width="'.$this->Width.'" height="'.$this->Height.'" frameborder="0" scrolling="no" '.
|
|---|
| 89 | 'marginheight="0" marginwidth="0" src="http://www.openstreetmap.org/export/embed.html'.
|
|---|
| 90 | '?bbox='.implode(',', $BoundingBox).'&layer=mapnik&marker='.$Latitude.','.$Longitude.'" '.
|
|---|
| 91 | 'style="border: 1px solid black"></iframe>'.
|
|---|
| 92 | '<p><small><a href="http://www.openstreetmap.org/'.
|
|---|
| 93 | '?lat='.$Latitude.'&lon='.$Longitude.';zoom='.$Zoom.'&layers=M&mlat='.$Latitude.'&mlon='.$Longitude.'">View Larger Map</a></small></p>';
|
|---|
| 94 | */
|
|---|
| 95 | return $Output;
|
|---|
| 96 | }
|
|---|
| 97 | }
|
|---|