Сохранение и восстановление геометрии в OpenLayers - PullRequest
17 голосов
/ 04 марта 2011

Контекст: я новичок в OpenLayers, которому всего несколько часов, пожалуйста, будьте осторожны.

По сути, у меня есть карта с нарисованными объектами.Если я правильно понимаю вещи, у меня есть несколько OpenLayer.Feature.Vector (слоев?) С несколькими «вещами» OpenLayer.Geometry (например, LinearRing).

В настоящий момент мне кажется, чтобыть в состоянии получить хорошее представление геометрии, используя .toString ().Да, я подозреваю, что я делаю это неправильно - не стесняйтесь указывать мне правильное направление.

Это дает очень удобочитаемые и сохраняемые в базе данных строки, такие как:

  • ТОЧКА (-104.74560546875 44,2841796875)

  • ПОЛИГОН ((- 96,52783203125 44,6796875, -96,52783203125 45,734375, -92,22119140625, 45,7343757), 739967575575, -3451755755, 1792755755, 1792) 675, 551753755751, ПБД

есть обратнаяспособ получить эти обратно в объектный формат, откуда они пришли?

Я бы хотел использовать JSON, но не могу заставить GeoJSON принять мой OpenLayer.Feature.Vector объект (это то, о чем говорит свойство CLASS_NAME, когда я заглядываю внутрь).

Большое спасибо.

Ответы [ 2 ]

29 голосов
/ 04 марта 2011

Метод Openlayers.Geometry объектов toString позволяет преобразовать их в WKT (общеизвестный текст). Если вы используете слой ГИС поверх вашей базы данных (например, PostGIS для PostGres, SQL Spatial для SQL Server, Spatialite для SQLite и т. Д.), Они должны предлагать функции, позволяющие обрабатывать WKT.

Но если вы хотите преобразовать этот WKT в новый объект Openlayers.Geometry (в браузере), вы можете использовать функцию fromWKT:

var point = OpenLayers.Geometry.fromWKT('POINT(-104.74560546875 44.2841796875)');
alert(point.toString()); // POINT(-104.74560546875 44.2841796875)

Здесь переменная point теперь будет содержать новый объект Openlayers.Geometry, который имеет те же свойства, что и исходный объект, который вы использовали toString().

Если вы передадите массив функции fromWKT, он вернет коллекцию GeometryCollection, содержащую все сгенерированные геометрии.

var geometryTexts = [
      'POINT(-104.74560546875 44.2841796875)'
    , 'POLYGON((-96.52783203125 44.6796875,-96.52783203125 45.734375,-92.22119140625 45.734375,-92.22119140625 44.6796875,-96.52783203125 44.6796875))'
    , 'LINESTRING(-105.71240234375 44.6796875,-106.06396484375 42.658203125,-103.55908203125 42.7021484375,-103.47119140625 45.55859375,-104.65771484375 45.20703125)'
    ],
    collection = OpenLayers.Geometry.fromWKT(geometryTexts);

После этого collection.toString() должно выдать следующее:

GEOMETRYCOLLECTION (точка (-104,74560546875 +44,2841796875), многоугольник ((- 96,52783203125 44,6796875, -96,52783203125 45,734375, -92,22119140625 45,734375, -92,22119140625 44,6796875, -96,52783203125 44,6796875)), LINESTRING (-105,71240234375 44,6796875, -106,06396484375 +42,658203125, -103,55908203125 +42,7021484375 , -103,47119140625 45,55859375, -104,65771484375 45,203125))

17 голосов
/ 04 марта 2011

В моем другом ответе я пошел с WKT, потому что вы упомянули об этом. Теперь я вижу, что вы, кажется, предпочитаете GeoJSON.

Чтобы преобразовать векторный слой или объект Openlayers.Geometry в строку GeoJSON, следует использовать функцию OpenLayers.Format.GeoJSON.write :

var geoJSON = new OpenLayers.Format.GeoJSON(),
    geoJSONText = geoJSON.write(geometryObject);

Обратите внимание, что вы должны иметь возможность передавать свой объект этой функции, поскольку (согласно документации) он принимает OpenLayers.Feature.Vector, а также OpenLayers.Geometry или массив функций.

И наоборот, когда вы получили строку GeoJSON, вы можете преобразовать ее обратно в объект, используя функцию OpenLayers.Format.GeoJSON.read :

var geometry = geoJSON.read(geoJSONText, 'Geometry');

Второй параметр позволяет указать, какой тип объекта вы хотите вернуть. Прочитайте документы, ссылки на которые приведены для получения дополнительной информации.

Кроме того, посмотрите на это демо для более подробного примера. (Просмотрите исходный код страницы, чтобы узнать, как они это делают).

...