0

我很好奇您的意见,什么是 SpatiaLite 和 OpenLayers 之间最有效的传输格式。目前我正在开发一个基于 SpatiaLite(SQLite 的扩展)和 OpenLayers 的应用程序,并且我使用 GeoJSON 作为传输格式。

我的程序: 1)通过php脚本查询数据库,使用SpatiaLite的函数AsGeoJSON,从而得到geojson格式的数据

2) 使用 php 的 print() 将检索到的数据从 php 变量传输到 JS 变量:

$result = $db->query($query);

$r = '{"type": "FeatureCollection","features": [';
while($row = $result->fetchArray(SQLITE3_ASSOC))
{
  $r .= '{"type":"Feature","properties":{}, "geometry":' . $row['geometry'] . '},';
}
$r .= ']}';
print'<script> CadastreBorder = ' . $r . '; </script>';

3) 通过阅读在 OpenLayers 中为矢量图层创建特征

var vectorLayer = new OpenLayers.Layer.Vector(name, {style: style, rendererOptions:
{zIndexing: true}});
var formatGeoJSON = new OpenLayers.Format.GeoJSON({});
vectorLayer.addFeatures(formatGeoJSON.read(CadastreBorder));
map.addLayer(vectorLayer);

有什么方法可以更有效、更好地实现相同的目标?谢谢!

4

1 回答 1

0

不确定速度,但如果您使用的是最新版本的 PHP(5.2 >=),您可能会考虑在 php 的数组上使用json_encode 。您可以创建一个看起来像这样的数组,而不是创建字符串:

$geoJSON_array = Array(
    "type" => "FeatureCollection",
    "features" => Array()
    );

并且对于每一行几何,将新表添加到“特征”:

Array(
    "type" => "Feature",
    "properties" => Array(),
    "geometry" => Array(... your geometry),
)

创建这样的数组后,运行json_encode它,你就到家了。为了安全起见,我会检查它是否有效(例如,使用http://geojsonlint.com/)。这可能会在以后为您提供帮助,例如,当需要支持新信息或向地图添加新类型的元素时。

问题:为什么不使用固定策略加载点?如果您将此 geoJSON 创建为文件/作为脚本,您还可以告诉 openlayers 自动下载它,如下所示:

var vectorLayer = new OpenLayers.Layer.Vector(name, {
    strategies: [new OpenLayers.Strategy.Fixed()],
    protocol: new OpenLayers.Protocol.HTTP({
        url: "json/my_geojson.json",
        format: new OpenLayers.Format.GeoJSON()
    }),
    style: style,
    rendererOptions: {zIndexing: true}
});
于 2013-03-26T02:09:35.283 回答