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