我在php中有一个函数:
//simple method with array()
$sensors = array();
$query = "select id, x(transform(wkb_geometry,". $epsg . ")) as lon, y(transform(wkb_geometry,". $epsg . ")) as lat from mytable;";
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
while ($row = pg_fetch_assoc($result)) {
//var_dump($row);
$mySensor = new sensor($row['id'],$row['lat'],$row['lon']);
$sensors[] = $mySensor->geoJSON();
}
echo json_encode($sensors);
Run Code Online (Sandbox Code Playgroud)
输出:
"features": [{
"type": "Feature",
"id": 1579028,
"x": 4.85310557823,
"y": 52.7205622103,
"geometry": {
"type": "Point",
"coordinates": [4.85310557823, 52.7205622103],
"crs": {
"type": "OGC",
"properties": {
"urn": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
}
Run Code Online (Sandbox Code Playgroud)
现在我已经重写了数组,成为这样的对象:
//advanced method with arrayObject:
class sensors extends ArrayObject {
function __construct($epsg){
$query = "select id, x(transform(wkb_geometry,". $epsg . ")) as lon, y(transform(wkb_geometry,". $epsg . ")) as lat from mytable;";
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
while ($row = pg_fetch_assoc($result)) {
//var_dump($row);
$mySensor = new sensor($row['id'],$row['lat'],$row['lon']);
$this[] = $mySensor->geoJSON();
}
}
}
$newsensors = new sensors($epsg);
echo echo json_encode($newsensors);
Run Code Online (Sandbox Code Playgroud)
但是这会将输出更改为:
"features": {
"0": {
"type": "Feature",
"id": 1579028,
"x": 4.85310557823,
"y": 52.7205622103,
"geometry": {
"type": "Point",
"coordinates": [4.85310557823, 52.7205622103],
"crs": {
"type": "OGC",
"properties": {
"urn": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
}
}
},
Run Code Online (Sandbox Code Playgroud)
这使得它无法用作OpenLayers的geoJSON.为什么json_encode函数会以这种方式运行?我可以关闭索引号的设置吗?这是一个可能的小虫子吗?
sal*_*the 11
json_encode将显示与任何对象相同的行为,即使是那些实现ArrayAccess接口的对象ArrayObject; 使用公共财产.
要获得您想要的行为,您应该传递一个实际的数组,可以通过调用来检索ArrayObject::getArrayCopy()(或者您可以将对象强制转换为数组).
echo json_encode($newsensors->getArrayCopy());
Run Code Online (Sandbox Code Playgroud)