在PHP中解析GeoJson String

时间:2012-08-01 14:48:28

标签: php postgresql geojson

我想从String下面获取多边形坐标。

{"polygon":{"type":"Feature","properties":[],"geometry":{"type":"Polygon","coordinates":[[[-7302732.4720101,6527844.6333235],[-3193477.8319711,6606116.1502766],[-5111129.9973226,5001550.0527375],[-6637424.5779086,4884142.7773079],[-7772361.5737289,5158093.0866438],[-7302732.4720101,6527844.6333235]]]},"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}}

这是GeoJson字符串,我使用以下代码解码为数组:

$polygon = CJSON::decode($str);

当我想得到多边形我得到错误!

$var= $polygon->polygon;

或使用以下代码:

$polygon = CJSON::decode($str,true);
$var = $polygon['polygon'];

虽然获取坐标:

foreach($polygon as $key=>$value)
$coordinates = $value['coordinates'];
or
$coordinates = $value[coordinates];

如何从geojson获取我从javascript发送到php的坐标,以便用postgis保存在postgresql上?

2 个答案:

答案 0 :(得分:2)

$polygon->polygon->geometry->coordinates[0]

$polygon['polygon']['geometry']['coordinates'][0]

你所拥有的是一个多维数组/对象,在你的情况下解码时不确定它是什么输出,因为看起来你有一个类做它我会使用json_decode,但无论如何。是的,从它的外观来看,多边形是主要对象,然后是几何体,它是一个具有类型和坐标的对象,然后坐标中有多个对象/数组。

上面的示例如果我输入正确的将显示该对象中的第一组坐标。当然你可以通过循环运行它,即:

如果它是一个对象,假设您的类解码为对象而不是数组。不完全确定$polygon = CJSON::decode($str,true);的作用。但如果它像json_decode()那样,那么你应该全部设定。

这是我在此处介绍的分解对象的方法,值得注意的是您可能需要检查计数,并查看对象是否先设置,或者对象中是否存在属性以防止其他方法代码打破了道路。但我在这里只是纯粹的例子,它将服务于它的目的。但是不会错误处理这就是为什么我说你可能想进一步详细说明它做这些检查。

无论如何,这是我的代码:

<?php
$str = '{"polygon":{"type":"Feature","properties":[],"geometry":{"type":"Polygon","coordinates":[[[-7302732.4720101,6527844.6333235],[-3193477.8319711,6606116.1502766],[-5111129.9973226,5001550.0527375],[-6637424.5779086,4884142.7773079],[-7772361.5737289,5158093.0866438],[-7302732.4720101,6527844.6333235]]]},"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}}';

$polygon = json_decode($str);
echo'<pre>';print_r($polygon);echo'</pre>';

$set = 1;
foreach($polygon->polygon->geometry->coordinates[0] as $coordinates)
{
    echo 'Set '.$set.': ';$set++;
    echo $coordinates[0].','.$coordinates[1].'<br>';
}
?>

在行动http://7pz.net/geojson-parse.php中查看(滚动到底部)

答案 1 :(得分:1)

这应该为您提供所有坐标的数组并逐行打印出来:

$string = '{"polygon":{"type":"Feature","properties":[],"geometry":{"type":"Polygon","coordinates":[[[-7302732.4720101,6527844.6333235],[-3193477.8319711,6606116.1502766],[-5111129.9973226,5001550.0527375],[-6637424.5779086,4884142.7773079],[-7772361.5737289,5158093.0866438],[-7302732.4720101,6527844.6333235]]]},"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}}';

$json = json_decode($string);

$coords_array = $json->polygon->geometry->coordinates[0];

foreach($coords_array as $c_a) {
        echo $c_a[0] . "," .$c_a[1] . "<br>"; 
    }

访问:

$coords_array[0];
$coords_array[1];
$coords_array[2];

基本上,您可以将JSON字符串转换为对象,并使用->表示法访问每个元素。

我通常使用一个名为http://jsonviewer.stack.hu/的网站来解码JSON并找到我需要的路径,然后只需将它们显示出来,如上面所示 - $json->polygon->geometry->coordinates;

在网站上亲自尝试。