Json文字列をGeojson形式に変更する必要があります。現在、私はJson_encode()関数を使用して、SQLクエリの結果をjson文字列に変換しています(このリンクで示されているように、JSONはMySQLの結果をエンコードします)。
このgeojson文字列をopenlayersで読み取り可能にしたい。
この目的でjson_encodeを使用するにはどうすればよいですか?または、これに使用できる別の機能はありますか?前もって感謝します。
3 に答える
(あなたの投稿から、PHPを使用していると思います)。
空間データをWKT(1)としてフェッチする場合、PHPバージョンのmapfishからGeoJSONクラス(2)を使用できます(このクラスはmapfishなしで使用できます)。
このために独自のアダプタを作成する必要があります。
HTH、
GeoJSON形式はかなり単純なので、SQLクエリが返すすべての生データをループして、GeoJSON形式の文字列を手動で作成します。次に、この文字列をサーバー側のコードからクライアントに渡し、そこでJavaScriptオブジェクトに解析してOpenLayersが使用できるようにします。
これは私が少し前に行ったRubyの例です。あなたがアイデアを得て、PHPで同じことができることを願っています:
json = "{ \"type\": \"FeatureCollection\", \"features\": ["
layer.get_feature_count.times do |i|
feature = layer.get_feature(i)
json += "{\"type\":\"Feature\", \"id\":" + feature.get_fid.to_s + ", \"properties\": {"
feature_defn = layer.get_layer_defn
feature_defn.get_field_count.times do |j|
field = feature_defn.get_field_defn(j)
json += "\"" + field.get_name_ref + "\":" + "\"" + feature.get_field(j).to_s + "\""
if j+1 < feature_defn.get_field_count
json += ", "
end
end
json += "}, "
#end of properties
geom = feature.get_geometry_ref
json += "\"geometry\":" + geom.export_to_json
#end of geometry
json += "}"
if i+1 < layer.get_feature_count
json += ", "
end
end
json += "]}"
私は実際、過去数週間にわたってこの同じ問題に取り組んできました。注意すべき重要な点:私は地理空間データベースを使用しておらず、通常の古いストレージを使用しています(正確にはMySQL)。
これが私がそれを達成した方法です(厄介なconcatステートメントなしで):
SQLテーブルの説明:
CREATE TABLE IF NOT EXISTS `conditions` (
`conditionsID` int(10) unsigned NOT NULL auto_increment,
`ICAO` varchar(4) default NULL,
`LOCATION` varchar(50) default NULL,
`LATITUDE` float default NULL,
`LONGITUDE` float default NULL,
`TEMPERATURE` float default NULL,
`TEMPERATURE_F` float default NULL,
`TEMPERATURE_C` float default NULL,
`FEELS_LIKE` float default NULL,
PRIMARY KEY (`conditionsID`),
KEY `ICAO` (`ICAO`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=56274738 ;
次に、json_encode PHPライブラリ(5.2で最初に利用可能、5.3のより良いオプション)を使用して、PHPオブジェクトからjsonオブジェクトをエンコードできます。文字列を操作する必要はありません。代わりに、疑似オブジェクトを操作できます(配列が好きで、その場で管理しやすい)。5.3には、きれいに印刷するオプションもあります。
私のPHPサーバーコード:
$feature_collection = array();
$feature_collection['type'] = "FeatureCollection";
$feature_collection['features'] = array();
$con = mysql_connect($DB_URI, $DB_USER, $DB_PASS);
if (!$con) {
$errorMessage = "Error: Could not connect to data database. Error: " . mysql_error();
} else {
mysql_select_db("data", $con);
$result = mysql_query("SELECT * FROM `conditions` WHERE LATITUDE > $LAT AND LONGITUDE > $LON GROUP BY LOCATION;");
while ($row = mysql_fetch_assoc($result)) {
$feature_collection['features'][] = createFeature($row['conditionsID'],
$row['LATITUDE'],
$row['LONGITUDE'],
$row);
}
}
echo json_encode($feature_collection);
function createFeature($ID, $lat, $lon, $data)
{
unset($data["LATITUDE"]);
unset($data["LONGITUDE"]);
$feature = array();
$feature["type"] = "Feature";
$feature["id"] = $ID;
$feature["geometry"] = array();
$feature["geometry"]["type"] = "Point";
$feature["geometry"]["coordinates"] = array($lon+0, $lat+0);
$feature["properties"] = $data;
$feature["properties"]["visible"] = "true";
return $feature;
}
機能をすばやく作成できるようにする「FeatureCreate」関数に注目してください。また、行のほぼ全体をプロパティオブジェクトに追加することにも注意してください。過剰/冗長ですが、コードが単純になります。
このスニペットがお役に立てば幸いです。それは私の仕事をします(そして私は他の人の提案を聞いてうれしいです)。