I wrote my first ever JSONP data provider in PHP during my (longish) lunch hour today. For a given “bounded box” of coordinates, it finds the bike paths within that box from OpenStreetMap and returns each path as a set of coordinates so you can use those path points as, for example, a polyline to display an “OSM Bike Path” layer on a Google Map.
I’m an OS kernel engineer, not a PHP web programming guru, so I’m having difficulty solving a problem with arrays and objects. If you know more than a little PHP I’d love a hand.
Update: I’ve figured out typecasting and setting an explicit array index when assigning the latlng pairs works, but I’m still confounded by each “FoundWay” object.
You can view a sample of the JSON string output here. You’ll see the returned data is an array of paths, where each path consists of a “name” and an array of “latlng” objects. Here’s one instance of a path:
"3":{"name":{"0":"Lykins Gulch Trail Crossing"},"latlng":[{"lat":{"0":"40.1641169"},"lng":{"0":"-105.1442890"}},{"lat":{"0":"40.1639857"},"lng":{"0":"-105.1438170"}}]}
In my code, the classes are defined like this.
class LatLng {
public $lat;
public $lng;
}
class FoundWay {
public $name; // name of the cycle path
public $latlng = array(); // array of LatLng objects
To create each “found way” and assign the name to it, I do this:
$foundway = new FoundWay(); $foundway->name = FindName($current);
I then create my array of LatLng objects and add each LatLng pair to my path array, like so:
// walk the list of nodes, and lookup lat/lng
// for each node.
foreach($current->nd as $nd) {
$latlng = new LatLng();
// find the node lat & lng
foreach ($parsed_xml->node as $thisnode) {
if (((integer)$thisnode[id]) == ((integer)$nd[ref])) {
$latlng->lat = $thisnode[lat];
$latlng->lng = $thisnode[lon];
$foundway->latlng[] = $latlng;
}
}
}
Finally, each instance of foundway is added to the master array that’s eventually jsonified with json_encode:
$returnpoints[] = $foundway;
How do I get rid of those “0″ things, which I guess are some sort of array index? Do I need to explicity keep an array index for my latlng and returnpoints arrays?
As an aside, it also kind of bugs me that the lat/lon values are strings instead of floats. I’ll try typecasting to see what happens with that.
I appreciate the hand!







