使用传单js的动态PHP geo json示例

时间:2014-01-03 21:04:07

标签: javascript php json d3.js leaflet

祝贺所有人。 Here是一些静态的GeoJson的Leaflet主站点上的示例。我想通过交换来自数据库(DB)的密度节点数据来使这更加动态。下面是一些代码,显示我尝试将静态代码与从PHP完成的数据库中检索的数据混合。

$jsonStr = "{\"type\":\"FeatureCollection\",\"features\":[";
    foreach($data as $info){
        if($counter == $count-1){
            $jsonStr .= "
                {\"type\":\"Feature\",\"id\":\"".$info["site_state"]."\",\"properties\":
                    {
                        \"name\":\"".$info["state_dscr"]."\",\"density\":".$info["coalesce"]."
                    }
                }";
        }else{
            $jsonStr .= "
                {\"type\":\"Feature\",\"id\":\"".$info["site_state"]."\",\"properties\":
                    {
                        \"name\":\"".$info["state_dscr"]."\",\"density\":".$info["coalesce"]."
                    }
                },";
        }   
        $counter++;
    }

$jsonStr .= "]}";

$test = json_decode($jsonStr);
//Validate the JSON
if($test === NULL){
    error_log("There is an issue with your json.");
}else{
    header('Content-Type: application/json');
    echo $jsonStr;
}

以上代码通过D3 json()调用运行,如下所示:

d3.json("js/statesDataJson.php", function(vioData) { ...}

在另一个js文件中。是的,我的json缺少状态坐标,这就是为什么我无法重现在传单教程网站上的示例中找到的等值区图层(见下面的链接)。

这是我试图让这个例子找到here 更有活力。我想我可以混合来自两个来源的数据并使用" desnity"来自一个源的节点数据并使用"几何"从另一个节点构建状态层。这就是我遇到问题的地方 我最初的想法是在数据库中为地理JSON设置一个表,并继续我上面动态复制this的示例。

我想知道我是否正在使用一个佳能球杀死一只蟑螂,并且有更有效的策略或解决方案。或者数据库是动态重建我的json的唯一方法吗?例如,任何倡导者试图解析json文件并编辑密度节点?似乎...... asinine,但我愿意接受建议。

谢谢

3 个答案:

答案 0 :(得分:4)

在PHP中生成和使用(Geo)JSON有一种更简单,更简洁的方法。正如Bibhas指出的那样,连接字符串非常麻烦并且容易出错。在PHP中构建一个对象,然后将其编码为JSON非常容易。例如:

//php array with data
$phpArray = array(
    array('id' => 'Foo', 'data' => 500),
    array('id' => 'Bar', 'data' => 1000)
);

//jsonString containing geometries
$jsonString = '{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]},"id":"Foo","properties":{"name":"Foo description"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]},"id":"Bar","properties":{"name":"Bar description"}}]}';

//decode jsonString to jsonObject
$jsonObject = json_decode($jsonString);

//loop through jsonObject
foreach($jsonObject->features as $key => $feature) {
    //check if there is data for this feature
    foreach($phpArray as $row) {
        if ($feature->id == $row['id']) {
            //attach data to feature
            $feature->properties->data = $row['data'];
        }
    }
    //overwrite feature in jsonObject
    $jsonObject->features[$key] = $feature;
}

//encode and output jsonObject
header('Content-Type: application/json');
echo json_encode($jsonObject);

输出:

{
    "type": "FeatureCollection",
    "features": [{
        "type": "Feature",
        "geometry": {
            "type": "Point",
            "coordinates": [0, 0]
        },
        "id": "Foo",
        "properties": {
            "name": "Foo description",
            "data": 500
        }
    },{
        "type": "Feature",
        "geometry": {
            "type": "Point",
            "coordinates": [0, 0]
        },
        "id": "Bar",
        "properties": {
            "name": "Bar description",
            "data": 1000
        }
    }]
}

由于您正在使用PHP工作,因此最简单的方法是使用PHP对象。那些你可以轻松编辑,比较,合并,无论你想做什么。

答案 1 :(得分:2)

您在那里建造的是FeatureFeatureCollectionGeoJSON。您可以找到/编写一个带有数组并转入GeoJSON的库。 GeoJSON网站在“库”部分下列出了a PHP implementationGeoJSON.class.php内的You can find it here。它没有任何文档,但有注释,代码相当简单,您应该能够使用该类,并形成您自己的GeoJSON并从您的服务器返回它。

答案 2 :(得分:1)

如果在DB中有空间扩展和空间数据类型,则可以使用以下堆栈:

  1. 从SQL导出形状:SELECT AsWKT(spat0)
  2. 使用geoPHP
  3. 加载它
  4. 使用geoPHP函数,GEOS本机扩展或SQL函数
  5. 进行转换
  6. 再次使用geoPHP将其转换为GeoJSON
  7. 或者,如果您的数据库支持它,它就会变得如此简单:

    1. SELECT ST_asGeoJSON(the_geom) ...
    2. 我需要做union / diff转换。拥有MySQL 5.5(这些功能自5.7以来在MySQL中实现)我需要另外安装GEOS lib。

      然后它就像:

      <?php
      include_once('geosPHP/geoPHP.inc');
      
      $wkt1 = $mysqli->query('SELECT AsWKT(shape) FROM table');
      
      $p1 = geoPHP::load($wkt1,'wkt');
      $p2 = geoPHP::load('POLYGON((2 2,2 4,4 4,4 2,2 2))','wkt');
      
      $union = $p1->union($p2);
      $geojsonConverter = new GeoJSON();
      $unionJson = $geojsonConverter->write($union);
      $unionJsonObj = $geojsonConverter->write($union, true); // to serve it as object and not string
      
      print "Union of p1&p2 in GeoJson: $unionJson\n";