I get a valid geojson from the database using a query. Below one is the php script used to read the data.
<?php
include "../includes/init.php"; // including data base connection
$sql = "SELECT *, ST_AsGeoJSON(geom) AS geojson FROM feature_drawn";
// echo $sql;
$query = $pdo->query($sql); // query executing
$geojson = array(
'type' => 'FeatureCollection',
'features' => array(),
);
foreach ($query as $row) {
$feature = array
(
'type' => 'Feature',
'geometry' => json_decode($row['geojson'], true),
'properties' => array
(
'name' => $row['name'],
'type' => $row['type'],
),
);
array_push($geojson['features'], $feature);
}
echo json_encode($geojson);
Below shown the javascript code that use to get the geojson object
var load_features = new ol.format.GeoJSON().readFeatures(
$.ajax({
type: 'GET',
url: 'scripts/load_features.php',
success: function(data, status) {
console.log(data);
console.log(JSON.parse(data));
}
})
);
var myview = new ol.View({
projection: 'EPSG:4326',
center: [80.98885377363007, 6.830454104603501], // remeber to set latlon in 'lon' first and 'lat' scecond
zoom: 17
});
// OSM Layer
var baseLayer = new ol.layer.Tile({
source: new ol.source.OSM()
});
// Draw vector layer
// 1. Define source
var draw_source = new ol.source.Vector({
features: load_features
})
// 2. Define layer
var draw_layer = new ol.layer.Vector({
source: draw_source
})
// Layer Array
var layer_array = [baseLayer, draw_layer]
// Map
var map = new ol.Map({
target: 'mymap',
view: myview,
layers: layer_array,
});
And here is what I get as a geojson object from console.log(data); console.log(JSON.parse(data));
{
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.988864502, 6.833924883]
},
"properties": {
"name": "sdfdfsdfd",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.991310677, 6.833206051]
},
"properties": {
"name": "sdfdfsdfddfd",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[80.989712081, 6.834246748],
[80.991203389, 6.834182375],
[80.990473828, 6.833334797],
[80.989669165, 6.832712525],
[80.990237793, 6.832100981]
]
},
"properties": {
"name": "sdfdfsdfddfd",
"type": "Roads"
}
}, {
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[80.988113484, 6.833699578],
[80.988971791, 6.83211171]
]
},
"properties": {
"name": "sdfdfsdfddfd",
"type": "Roads"
}
}, {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[80.987641415, 6.827981108],
[80.9870406, 6.827015513],
[80.987459025, 6.82657563],
[80.988907418, 6.826725834],
[80.987641415, 6.827981108]
]
]
},
"properties": {
"name": "sdfdfsdfddfd",
"type": "Buildings"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.988816223, 6.833892697]
},
"properties": {
"name": "a",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.989459953, 6.832787626]
},
"properties": {
"name": "ab",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.98782917, 6.830491656]
},
"properties": {
"name": "abc",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.991745195, 6.83312022]
},
"properties": {
"name": "abcd",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.989733538, 6.832605236]
},
"properties": {
"name": "q",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.984444222, 6.830062502]
},
"properties": {
"name": "s",
"type": "Trees"
}
}]
}
I verified the geojson using geojsonlint.com and it showed every feature without any problem.
But the problem is, in my map it does not show up. It shows this error on the console.
Uncaught Error: Unsupported GeoJSON type: undefined
at i_ (ol.js:2)
at n.readFeatureFromObject (ol.js:2)
at n.readFeaturesFromObject (ol.js:2)
at n.readFeatures (ol.js:2)
at main.js:255
This is what included in main.js
line 255
Then I tried removing $.ajax
call within readFeatures
and pasted the whole geojson object insode the readFeatures()
Below shown the change
var load_features = new ol.format.GeoJSON().readFeatures(
{
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.988864502, 6.833924883]
},
"properties": {
"name": "sdfdfsdfd",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.991310677, 6.833206051]
},
"properties": {
"name": "sdfdfsdfddfd",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[80.989712081, 6.834246748],
[80.991203389, 6.834182375],
[80.990473828, 6.833334797],
[80.989669165, 6.832712525],
[80.990237793, 6.832100981]
]
},
"properties": {
"name": "sdfdfsdfddfd",
"type": "Roads"
}
}, {
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[80.988113484, 6.833699578],
[80.988971791, 6.83211171]
]
},
"properties": {
"name": "sdfdfsdfddfd",
"type": "Roads"
}
}, {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[80.987641415, 6.827981108],
[80.9870406, 6.827015513],
[80.987459025, 6.82657563],
[80.988907418, 6.826725834],
[80.987641415, 6.827981108]
]
]
},
"properties": {
"name": "sdfdfsdfddfd",
"type": "Buildings"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.988816223, 6.833892697]
},
"properties": {
"name": "a",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.989459953, 6.832787626]
},
"properties": {
"name": "ab",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.98782917, 6.830491656]
},
"properties": {
"name": "abc",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.991745195, 6.83312022]
},
"properties": {
"name": "abcd",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.989733538, 6.832605236]
},
"properties": {
"name": "q",
"type": "Trees"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [80.984444222, 6.830062502]
},
"properties": {
"name": "s",
"type": "Trees"
}
}]
}
);
Then there is no error shown in the console and All the features are shown on the map.
I was looking for hour for a solution, and still I do not understand what is defined by Unsupported GeoJSON type: undefined
. Please help me.
Best Answer
JQuery
$.ajax
method does not return the data, but promise to fetch the data. This means you have to turn your GeoJSON data fetch inside out: