Сохранение и восстановление геометрии в OpenLayers

Контекст. Я новичок в OpenLayers, но все-таки новичок.

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

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

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

  • POINT (-104.74560546875 44.2841796875)

  • ПОЛИГОН ((- 96.52783203125 44.6796875, -96.52783203125 45.734375, -92.22119140625 45.734375, -92.22119140625 44.6796875, -96.52783203125 44.6796875))

  • ЛИНИЯ (-105.71240234375 44.6796875, -106.06396484375 42.658203125, -103.55908203125 42.7021484375, -103.47119140625 45.55859375, -104.65771484375 45.20703125)

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

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

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

Ответы

Ответ 1

Openlayers.Geometry objects toString метод отлично преобразует их в WKT (хорошо известный текст). Если вы используете GIS-слой поверх своей базы данных (например, 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() on.

Если вы передадите массив функции 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.20703125))

Ответ 2

В моем другом ответе я пошел с 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');

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

Также рассмотрим эту демонстрацию для более обширного примера. (Просмотрите источник страницы, чтобы увидеть, как они это делают).