Треки OpenLayers из GeoJSON

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

Треки OpenLayers из GeoJSON

Сообщение Tink » 26 сен 2012, 10:02

Есть трекер, являющийся источником данных для слоя движущихся точек OpenLayers.
Слой создается так (может и криво, но как уж смог) - сервер отдает GeoJSON:

Код: Выделить всё

point = new OpenLayers.Layer.Vector(
        "Point",
        {
            visibility: false,
            projection: map.displayProjection,
            protocol: new OpenLayers.Protocol.Script({
                url: "http://sitetrackerpoint.ru/",
                filterToParams: function(filter, params) {
                    if (filter.type === OpenLayers.Filter.Spatial.BBOX) {
                        params.bbox = filter.value.toArray();
                        if (filter.projection) {
                            params.bbox.push(filter.projection.getCode());
                        }
                    }
                    return params;
                }
            }),
            strategies: [
                new OpenLayers.Strategy.Refresh({force: true, interval: 20000}),
                new OpenLayers.Strategy.BBOX({resFactor: 1.1})
            ],
            styleMap: new OpenLayers.StyleMap({
                'default': defStyle, 
                'select': selStyle
            }),
            eventListeners: {
                'featureselected': OnMouseEnter,
                'featureunselected': OnMouseLeave
            }
        }
    );
Как создать слой трека запрашивающего у того же трекера трек в формате GeoJSON (кстати какой вид GeoJSON-а) ?
Пока я создаю слой:

Код: Выделить всё

track = new OpenLayers.Layer.PointTrack('Track', { styleFrom: OpenLayers.Layer.PointTrack.SOURCE_NODE, style: { strokeColor: '#029aee', strokeWidth: 3} });
Потом сам запрашивю JSON у трекера Ajax-ом список точек трека, и

Код: Выделить всё

var trackpoints = [];
$(result.trackpoints).each(function (i, e) {
    var pnt = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(e.x, e.y));
    trackpoints.push(pnt);
});
track.addNodes(trackpoints);
Это конечно работает, но хотелось бы обновление трека переложить на OpenLayers, хотя бы как это сделано для точек - т.е. задать источник в protocol и такую же частоту обновления что и для точек.
Последний раз редактировалось Tink 28 сен 2012, 07:45, всего редактировалось 1 раз.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Треки OpenLayers из GeoJSON

Сообщение Denis Rykov » 26 сен 2012, 10:25

OpenLayers.Strategy.Refresh

Код: Выделить всё

underway = new OpenLayers.Layer.Vector("WFS", {
strategies: [
new OpenLayers.Strategy.BBOX(),
new OpenLayers.Strategy.Refresh({interval: 4000, force: true})
],
protocol: new OpenLayers.Protocol.WFS({
url: "http://ubuntu-geospatial-server:8080/geoserver/wfs",
featureType: "ss2011_v03",
featureNS: "http://csiro.au/underway",
geometryName: "position"
})
});
Spatial is now, more than ever, just another column- The Geometry Column.

Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

Re: Треки OpenLayers из GeoJSON

Сообщение Tink » 26 сен 2012, 15:33

Спасибо, буду разбираться с WFS. После вашего ответа нашел тему Layer и Format в OpenLayers.
А по поводу формата GeoJSON - он должен содержать точки (как для слоя точек, из первого поста)

Код: Выделить всё

({"type":"FeatureCollection",
    "features":[{
            "type":"Feature",
            "geometry":{
                "type":"Point",
                "coordinates":[40.7855, 50.9255 ]
            },
            "properties":{
                "name":"my name",
                "time":"\/Date(1336270055000+0400)\/"
            }
    }]
})
или какие-то другие гео-объекты ?
Последний раз редактировалось Tink 28 сен 2012, 07:47, всего редактировалось 1 раз.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Треки OpenLayers из GeoJSON

Сообщение Denis Rykov » 27 сен 2012, 05:28

а зачем вам WFS? geojson может содержать не только точки, но и линии и полигоны.
Spatial is now, more than ever, just another column- The Geometry Column.

Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

Re: Треки OpenLayers из GeoJSON

Сообщение Tink » 27 сен 2012, 08:14

Да я в курсе, что GeoJSON может содержать различные объекты, просто меня интересует его формат для передачи трека: достаточно того что в нем будут точки трека, или нужны линии или может даже полигон ?
Если достаточно того что в GeoJSON придет массив точек, то просто отлично. :)
Denis Rykov писал(а):а зачем вам WFS? geojson может содержать не только точки, но и линии и полигоны.
:| Вы во втором посте привели пример со слоем WFS, который, если верить информации в интернете (к сожалению найти удалось крайне мало), позволяет задавать парсер - т.е. может принимать данные из источника и в формате GeoJSON. На данный же момент я использую слой OpenLayers.Layer.PointTrack, но добавляю туда точки трека сам, запрашивая их по таймеру Ajax-ом. Естественно получается не очень красиво, да и не шустро. Хочется запрос трека переложить на OpenLayers.

Или в слой PointTrack можно как-то загрузить данные и напрямую, и сразу в GeoJSON ? :?:
Последний раз редактировалось Tink 28 сен 2012, 07:48, всего редактировалось 1 раз.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Треки OpenLayers из GeoJSON

Сообщение Denis Rykov » 28 сен 2012, 07:23

Не совсем понимаю в каком моменте вы хотите выиграть по производительности, вроде сейчас всё правильно делаете.
Spatial is now, more than ever, just another column- The Geometry Column.

Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

Re: Треки OpenLayers из GeoJSON

Сообщение Tink » 28 сен 2012, 07:43

Во-первых, запрашивая трек Ajax-ом по таймеру я вынужден проверять видимость слоя, и останавливать таймер когда он не видим и запускать при его отображении.
Во-вторых, была явно заметна постепенная отрисовка точек на карте, при их большом числе, а когда я их переделал (переложив все с таймера и "ручного" наполнения слоя точками на OpenLayers обновление данных стало заметно шустрее, тем более что OpenLayers с BBOX стратегией на слое сам отслеживает и передает размеры видимой области карты, что для точек весьма полезно).
Ну и в-третьих, использование источника данных для векторных слоёв OpenLayers значительно сокращает код, - его проще поддерживать.

Кстати, разобрался с треком, правда отказался от PointTrack в пользу того же Vector:

Код: Выделить всё

track = new OpenLayers.Layer.Vector(
    "Track", 
    {
        visibility: false,
        protocol: new OpenLayers.Protocol.Script({url: "http://sitetrackerpoint.ru/?track=id"}),
        projection: map.displayProjection,
        strategies: [
            new OpenLayers.Strategy.Fixed(),
            new OpenLayers.Strategy.Refresh({force: true, interval: 10000})
        ],
        styleMap: new OpenLayers.StyleMap({
            'default': new OpenLayers.Style({ strokeWidth: 3 })
        })
    }
);
И использую LineString в GeoJSON для передачи трека:

Код: Выделить всё

({"type":"FeatureCollection",
    "features":[{
            "type":"Feature",
            "geometry":{
                "type":"LineString",
                "coordinates":[ [ 18.105018, 59.231027 ], [ 18.104176, 59.230737 ] ]
            },
            "properties":{
                "name":"my name",
                "time":"\/Date(1336270055000+0400)\/"
            }
    }]
})
Если можно сделать как то лучше, буду признателен за совет или пример.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя