58 lines
1.9 KiB
PHP
58 lines
1.9 KiB
PHP
<?php
|
|
/*
|
|
* Title: PostGIS to GeoJSON
|
|
* Notes: Query a PostGIS table or view and return the results in GeoJSON format, suitable for use in OpenLayers, Leaflet, etc.
|
|
* Author: Bryan R. McBride, GISP
|
|
* Contact: bryanmcbride.com
|
|
* GitHub: https://github.com/bmcbride/PHP-Database-GeoJSON
|
|
*/
|
|
|
|
# Connect to PostgreSQL database
|
|
$conn = new PDO('pgsql:host=localhost;dbname=postgisftw','pgis','MYPGISPASSWORD');
|
|
|
|
# Build SQL SELECT statement and return the geometry as a GeoJSON element
|
|
$sql = "SELECT *, public.ST_AsGeoJSON(geom) AS geojson FROM countries WHERE continent = 'Europe'";
|
|
|
|
/*
|
|
* If bbox variable is set, only return records that are within the bounding box
|
|
* bbox should be a string in the form of 'southwest_lng,southwest_lat,northeast_lng,northeast_lat'
|
|
* Leaflet: map.getBounds().toBBoxString()
|
|
*/
|
|
if (isset($_GET['bbox'])) {
|
|
$bbox = explode(',', $_GET['bbox']);
|
|
$sql = $sql . ' WHERE public.ST_Transform(geom, 4326) && public.ST_SetSRID(public.ST_MakeBox2D(public.ST_Point('.$bbox[0].', '.$bbox[1].'), public.ST_Point('.$bbox[2].', '.$bbox[3].')),4326);';
|
|
}
|
|
|
|
# Try query or error
|
|
$rs = $conn->query($sql);
|
|
if (!$rs) {
|
|
echo 'An SQL error occured.\n';
|
|
exit;
|
|
}
|
|
|
|
# Build GeoJSON feature collection array
|
|
$geojson = array(
|
|
'type' => 'FeatureCollection',
|
|
'features' => array()
|
|
);
|
|
|
|
# Loop through rows to build feature arrays
|
|
while ($row = $rs->fetch(PDO::FETCH_ASSOC)) {
|
|
$properties = $row;
|
|
# Remove geojson and geometry fields from properties
|
|
unset($properties['geojson']);
|
|
unset($properties['geom']);
|
|
$feature = array(
|
|
'type' => 'Feature',
|
|
'geometry' => json_decode($row['geojson'], true),
|
|
'properties' => $properties
|
|
);
|
|
# Add feature arrays to feature collection array
|
|
array_push($geojson['features'], $feature);
|
|
}
|
|
|
|
header('Content-type: application/json');
|
|
echo json_encode($geojson, JSON_NUMERIC_CHECK);
|
|
$conn = NULL;
|
|
?>
|