在yii框架中从geojson获取多边形坐标

时间:2012-08-01 16:17:53

标签: php postgresql yii geojson

我使用Yi框架和GeoExt开发基于地图的Web应用程序。在这个应用程序中我有一个功能,用户可以绘制多边形,当点击它我发送带有ajax的多边形信息到控制器动作,以将此多边形保存在数据库上。在数据库上保存多边形我需要多边形的坐标。为了得到多边形坐标我在我的控制器动作中使用下面的代码。但我不知道我可以得到多边形坐标或没有理解它我发送坐标到$ .ajax成功函数我的动作代码,但我的浏览器控制台出错!
行动代码:

public function actionTest()
{
   if(isset($_POST['polygon']) && isset($_POST['name'])){
            $str = $_POST['polygon'];
            $polygon = CJSON::decode($str);
            $coordinates = $polygon->polygon->geometry->coordinates[0];
   }
   echo CJSON::encode(array('polygon'=> $coordinates));
}

$。ajax代码:

function save(feature) {
        var geojson_format = new OpenLayers.Format.GeoJSON();
        var str = geojson_format.write(feature);
        str = str.replace(/,/g, ', ');
        Ext.MessageBox.prompt('Name', 'Please enter district name:', function(btn, text){
                if (btn == 'ok' && text.length > 0){
                    <?php 
                        echo CHtml::ajax(array(
                            'url'=>array('site/test'),
                            'data'=>array('polygon'=>'js:str',
                                'name'=>'js:text'),
                            'type'=>'POST',

                            'success'=>"function(data){
                                    console.log(data);
                                }"
                        ));
                    ?>
                    $("#output").val(str);
                }
                else if(btn == 'ok' && text.length == 0)
                    Ext.MessageBox.alert('Error', 'Please Enter Name For Polygon To Save');
            });
}

浏览器控制台出错:

POST http://localhost/FleetManagement/index.php/site/test 500 (PHP Error) jquery.js:8102 jQuery.ajaxTransport.send jquery.js:8102 jQuery.extend.ajax jquery.js:7580 modify.mode/FleetManagement/:254(anonymous function)

但是当我使用下面的代码进行操作时,我可以在控制台中获取String:

public function actionTest()
{
   if(isset($_POST['polygon']) && isset($_POST['name'])){
            $str = $_POST['polygon'];
            $polygon = CJSON::decode($str);
   }
   echo CJSON::encode(array('polygon'=> $polygon ));
}

使用上面的代码后,我可以在浏览器控制台中获得以下字符串:

{"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"}}}}

为什么我无法获得坐标,我该怎么做呢? 我在chrome控制台中看到下面代码输出var_dump!

<pre class='xdebug-var-dump' dir='ltr'>
<b>array</b>
'type' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'Feature'</font> <i>(length=7)</i>
'properties' <font color='#888a85'>=&gt;</font> 
<b>array</b>
<i><font color='#888a85'>empty</font></i>
'geometry' <font color='#888a85'>=&gt;</font> 
<b>array</b>
'type' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'Polygon'</font> <i>(length=7)</i>
'coordinates' <font color='#888a85'>=&gt;</font> 
<b>array</b>
0 <font color='#888a85'>=&gt;</font> 
<b>array</b>
 ...
'crs' <font color='#888a85'>=&gt;</font> 
<b>array</b>
'type' <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'name'</font> <i>(length=4)</i>
'properties' <font color='#888a85'>=&gt;</font> 
<b>array</b>

我不知道为什么坐标不会出现在控制台的节目中......而不是主题!

1 个答案:

答案 0 :(得分:1)

我不确定你为什么试图将多边形坐标传回去;听起来好像你应该将它保存到actionTest中的数据库中,并且不需要将它发送回客户端?

无论如何,我认为你的代码应该在这一行抛出一个PHP错误:

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

你确定$ polygon是一个对象吗?我认为它是一个数组,所以你需要使用数组引用,例如:

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

在任何情况下,在actionTest中执行一些var_dump(),以确保在将值传递给JS之前,这些值是您期望的值。