сделать мою строку Json проанализированной openlayers.format.geojson - PullRequest
0 голосов
/ 06 июля 2011

Мне нужно изменить строку Json в формате Geojson. сейчас я использую функцию Json_encode () для преобразования результата запроса sql в строку json (как показано в этой ссылке JSON-кодирование результатов MySQL ).
я хочу сделать эту строку геоджона удобочитаемой для openlayers.
Как я могу использовать json _encode для этой цели? или есть другая функция, которую я могу использовать для этого? заранее спасибо.

Ответы [ 3 ]

1 голос
/ 08 июля 2011

Формат 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 += "]}"
1 голос
/ 08 июля 2011

Я действительно работал над этой же проблемой последние несколько недель.Важно отметить: я не использую геопространственную базу данных, я просто использую обычное хранилище (точнее, 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 ;

Затем я могу использовать библиотеку PHP json_encode (впервые доступна в 5.2, улучшенные опции для 5.3) для кодирования объекта json из объекта PHP.Больше не нужно работать со строками, вместо этого я могу работать с псевдообъектами (я предпочитаю массивы, которыми легко управлять на лету).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, которая позволяет быстро создавать функции.Также обратите внимание, что я добавляю почти всю строку в объект свойств.Overkill / Redundant, но упрощает код.

Надеюсь, этот фрагмент поможет.Это делает мою работу (и я был бы рад выслушать предложения других).

1 голос
/ 07 июля 2011

(я предполагаю из вашего поста, что вы используете PHP).

Если вы выбираете пространственные данные как WKT (1), вы можете использовать класс GeoJSON (2) из ​​версии mapfish для PHP(этот класс может использоваться без mapfish).

Вам просто нужно написать собственный адаптер для этого.

HTH,

...