Webkaartje met Fietstags

Mooi initiatief jong’s. Helaas poepie druk op het werk en dus staan vrijwel alle OSM activiteiten tijdelijk in de ijskast, maar ik hoop even snel een bijdrage te kunnen leveren.

IE lijkt dus te bokken op een cross site call, de standaard oplossing hiervoor is een proxy, de mooiste oplossing een javascript/html truuk die in bijvoorbeeld tools als jQuery zit, maar met de standaard oplossing heb ik wat ervaring:
Alle AJAX aanvragen van de browser die naar een pagina buiten de mijndev site gaan moeten via een proxy op de mijndev site gestuurd worden. Zo’n proxy is een simpel (PHP) script dat de request parameters doorstuurt naar de eigenlijke pagina, het antwoord inleest en teruggeeft aan de browser. Het is een omweg maar het werk. Zoek je op ‘cross site’ en ‘proxy’ dan kom je hier genoeg voorbeelden van tegen maar met onderstaand script van phpfour.com heb ik goede ervaringen.

<?php

/**
 * Transport for Cross-domain AJAX calls
 *
 * This is an implementation of a transport channel for utilizing cross-domain
 * AJAX calls. This script is passed the data through AJAX along with two special
 * hidden field containing the action URL and the http method (GET/POST). It then  
 * sends the form fields to that URL and returns the response.
 *
 * @package		CrossDomainAjax
 * @category	CURL
 * @author		Md Emran Hasan <phpfour@gmail.com>
 * @author		Lambertus IJsseltein: security fix (allowed domains), flexible headers
 * @link		http://www.phpfour.com
 */

// The domains we're allowed to contact
$allowedDomains = array('http://gazetteer.openstreetmap.org/', 
					'http://nominatim.openstreetmap.org/', 
					'http://dev.openstreetmap.nl/', 
					'http://www.yournavigation.org/',
					'http://yournavigation.org/',
					'http://planetosm.oxilion.nl/',
					'http://osm.pleiades.uni-wuppertal.de/');

// The actual form action
$action = $_REQUEST['url'];

// Submission method
$method = $_REQUEST['method'];

// Query string
$fields = '';

// Check the url for allowed domains
$fail = true;
foreach ($allowedDomains as $domain)
{
    if (strpos(substr($action, 0, strlen($domain)), $domain) !== false)
    {
        $fail = false;
	break;
    }
}

if ($fail == true)
{
    exit("Domain name '".$action."' not allowed. Access denied.");
}

// Prepare the fields for query string, don't include the action URL OR method
if (count($_REQUEST) > 2)
{
    foreach ($_REQUEST as $key => $value)
    {
        if ($key != 'url' && $key != 'method')
        {
            $fields .= $key . '=' . rawurlencode($value) . '&';
        }
    }
}

// Strip the last comma
$fields = substr($fields, 0, strlen($fields) - 1);

// Initiate cURL
$ch = curl_init();

// Do we need to POST of GET ?
if (strtoupper($method) == 'POST')
{   
    curl_setopt($ch, CURLOPT_URL, $action);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
}
else
{
    curl_setopt($ch, CURLOPT_URL, $action . '?' . $fields);   
}

// Follow redirects and return the transfer
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "transport.php (CURL)");
 
// Get result and close cURL
$result = curl_exec($ch);
$curl_info = curl_getinfo($ch);
curl_close($ch);

// Return the response
header("Content-type: ".$curl_info['content_type']);
echo $result;

?>

Plaats het bovenstaande script in http://mijndev.openstreetmap.nl/~ligfietser/fiets/ en vervang de allowedDomains array met de sites die je moet kunnen benaderen. Deze methode van whitelisting is noodzakelijk omdat je site anders misbruikt kan worden voor allerlei illegale activiteiten.

Vervolgens plaats je in de JavaScript de AJAX call de url van dit proxy-script voor de externe url die je nu aanroept. Bijvoorbeeld:

OpenLayers.Request.GET({
			url: "proxy.php?url=http://overpass-api.de/api/interpreter/",
			callback: onLoadMenu}
			);

Het interessante stukje hierin is: “proxy.php?url=”. Hiermee veranderd de externe AJAX call naar een locale AJAX call en dan mag het wel van IE. Ik hoop dat jullie hier wat aan hebben.

Daar ging het dus mis. Het lijkt erop dat php niet op mijndev draait. Of curl niet is toegevoegd. Of dat het gewoon niet geactiveerd is voor Ligfietsers’ account.
De proxy op mijn server draait prima voor tests, maar dat is niet echt een productieserver te noemen.
Alternatief is het ombouwen van openlayers om >=7 IE < 10 met de alternatieve IE call te ondersteunen maar overpass lijkt dan niet de juiste header terug te geven. Vanf IE10 is CORS volgens de standaard ondersteund en dan gaat het gewoon goed.

Wat ligfietser dus nodig heeft is iemand met meer kennis van mijndev: wel of niet php / curl ?

Noordfiets, ik heb jouw checkurl.php ook op de Duitse server gezet waar Lambertus ook zijn kaarten heeft gehost: http://osm.pleiades.uni-wuppertal.de/openfietsmap/fietsoverlay/api/interpreter/checkurl.php
Deze geeft itt mijndev wel antwoord: cURL is NOT installed

Ok, zet even een php bestandje met onderstaande code op de server om te bepalen of PHP en of CURL wel geinstalleerd is en roep het bestandje aan in je browser:

<?php
phpinfo();
?>

Ik vermoed dat php-libcurl niet geinstalleerd is.

Edit 1: ligfietser is me voor.

Edit 2: ik heb de beheerder van mijndev (Sander Hoentjen van Oxilion) een mailtje gestuurd.

Lambertus:
(files removed)

Ligfietser, haal die testbestandjes maar weer weg, ze geven belangrijke security info over de server.

Wat me opvalt is dat zowel php als curl geinstalleerd zijn op mijndev. FF nadenken…

Oops, sorry Lambertus, heb ze weer verwijderd.
Hoop dat je er chocola van kan maken. In ieder geval reuze bedankt voor het meedenken.

Het zou al wat kunnen helpen als je een test-url met de proxy.php kunt posten en de volgende regels bovenaan in het proxy script zet:

<?php
ini_set('display_errors',1); 
error_reporting(E_ALL);

[...]

?>

http://mijndev.openstreetmap.nl/~ligfietser/fiets/api/interpreter/test.php

Ja, nu geeft die antwoord: cURL is installed

Welke URL heeft het proxy script gekregen? Ik wil graag de reactie zien van bijvoorbeeld:

http://mijndev.openstreetmap.nl/~ligfietser/fiets/api/interpreter/proxy.php?url=http://overpass-api.de/api/interpreter/

Ik heb nu Noordfiets’ proxy gekopieerd:
http://mijndev.openstreetmap.nl/~ligfietser/fiets/api/interpreter/index.php

En ook zijn site, http://mijndev.openstreetmap.nl/~ligfietser/fiets/noordfiets
Maar zijn QURL naar http://mijndev.openstreetmap.nl/~ligfietser/fiets/api/interpreter/ werkt nog niet.

		var proxy = true;
		
		if (proxy){
			var QURL = "http://mijndev.openstreetmap.nl/~ligfietser/fiets/api/interpreter/";
		}
		else{
			var QURL = "http://overpass-api.de/api/interpreter/"; //default
		}
		

Doet ook niets in andere browsers dus er is iets nog niet goed.

index.php:

<?
ini_set('display_errors',1); 
error_reporting(E_ALL);
// basis url
$overpass_url = "http://overpass-api.de/api/interpreter?data=";

$data = $_GET["data"]; // de string met de query
$bbox = $_GET["bbox"]; // is de bounding box die (bbox) in bovenstaande string  vervangt
$data = str_replace( "\\" , "" , $data); // als magic quotes aanstaat dubbele slash verwijderen, en anders niet van invloed
$data = urlencode($data); // vorm geven voor correcte request
$bbox = urlencode($bbox);
$request = $overpass_url.$data."&bbox=".$bbox;

$proxy = curl_init($request);
curl_setopt($proxy, CURLOPT_RETURNTRANSFER, 1);
header('Content-type: application/osm3s+xml');	// dit zet speciale header voor osm-xml
$response = curl_exec($proxy); // stuur de query naar overpass
print $response; // en het resultaat naar de client
curl_close($proxy);	
?>

Oops, lijkt er op alsof mijndev wat stricter is … zet in mijn scriptje eens ‘php’ achter de openingstag ‘<?’. Dus volledig <?php

Ja, die doet het nu :smiley:
Bedankt!

Dus al die tijd waren het drie lettertjes …
Werkt inderdaad prima zo, veel sneller dan die ouwe server hier ook.

tip: haal in de index.html nog de tekst ‘status’ bij de status-div weg en zet in de stylesheet bij div.statusline als extra ‘visibility: hidden;’ . Dan komt er bij het eerste laden niet zo’n loze melding over de status.

Het proxyscriptje wat er nu staat is nogal strak dwz zonder bbox en data geeft ie een fout terug. Adres is http://mijndev.openstreetmap.nl/~ligfietser/fiets/api/interpreter . En het antwoord is hard gecodeerd als Content-type: application/osm3s+xml, dus de meeste browsers laten dat zelfs niet zomaar zien omdat ze het niet herkennen.

Dus

http://mijndev.openstreetmap.nl/~ligfietser/fiets/api/interpreter?data=(way[highway=cycleway](bbox);node(w););out skel;&bbox=6.515068359375,53.176810443687,6.624931640625,53.223186420239

geeft een set fietspaden als antwoord.

Noordfiets, jouw wijzigingen zijn toegevoegd.
Ik heb ook een shortcut gemaakt: http://tinyurl.com/bicycletags

Het duizelt me bij het lezen van deze correspondentie. Hier worden grootse dingen verricht!
Helaas mis ik nu hier en daar eenvoudige rwn-routes die wél zijn getagd.
Voorbeelden zijn relaties 284362, 284363 en 284365.
Het zijn slechts wandelroutes maar nu we gelukkig, heel comfortabel, op de bagagedrager van de fietsers mogen meeliften, zou ik het leuk vinden als jullie dat óók nog in orde zouden kunnen brengen.
Veel succes, ik volg het allemaal met belangstelling.
Jan

Tja Jan, jullie wandelaars maken er ook een zootje van, route=walking, route=foot, route=hiking, wat zijn de verschillen? :wink:
Anyway, ze zijn nu zichtbaar: http://mijndev.openstreetmap.nl/~ligfietser/fiets/?map=route&zoom=14&lat=51.54508&lon=5.1483&layers=B00000FFFFFFTFFFF

Om misverstanden te voorkomen heb ik ook de rwn_ref knooppunten die ook rcn_ref fietsknooppunten zijn, eruit gehaald omdat er nog geen oplossing is ze beiden te tonen (kan wel, bv met rwn_ref/rcn_ref, maar dat blijft verwarrend voor de fietsers). Jullie moeten dus maar gauw een eigen kaartje maken, misschien dat Traildino dat kan?

Ligfietser,
bedankt voor de lift.
Jan

Het weglaten van de dubbele knooppunten op de wandelkaart lijkt me een heel goede oplossing.

Niet om de inspanningen van de Nederlanders teniet te doen, maar zo is het mooi!

  <relation id="76712">
    <tag k="lwn" v="Essen"/>
    <tag k="name" v="Anna-Linder-Weg"/>
    <tag k="network" v="lwn"/>
    <tag k="operator" v="Sauerländischer Gebirgsverein"/>
    <tag k="osmc:symbol" v="black:black::AL:white"/>
    <tag k="ref" v="AL"/>
    <tag k="route" v="foot"/>
    <tag k="symbol" v="Weißes verschlungenes AL auf schwarzem Grund"/>
    <tag k="type" v="route"/>
    <tag k="wiki:symbol" v="Ortswanderwege_11.gif"/>
  </relation>

Vooral die extra lwn tag is geweldig. Zo kun je lokale routes op plaats of gebied filteren.