在OpenLayers中保存和恢复几何

Wal*_*ner 17 persistence json geospatial openlayers geojson

背景:我是OpenLayers的一个只有几个小时的新手,请保持温柔.

从根本上说,我有一个地图上有一些绘制的对象.如果我理解正确,我有一些OpenLayer.Feature.Vector(layers?),上面有许多OpenLayer.Geometry"thing"(如LinearRing).

目前,我似乎能够使用.toString()获得几何体的良好表示.是的,我怀疑我做错了 - 随意指出我正确的方向.

这产生了一个非常人性化的,可存储数据库的字符串,例如:

  • 要点(-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)

有没有一种相反的方法可以将它们从那里带回到对象格式中?

我喜欢使用JSON,但似乎无法让GeoJSON接受我的OpenLayer.Feature.Vector对象(这是CLASS_NAME属性在我进入内部时所说的).

非常感谢.

Mar*_*ijn 29

Openlayers.Geometry对象的toString方法,很好地将它们转换为WKT(熟知文本).如果你对你的数据库上使用地理信息系统层(如PostGIS的Postgres的,SQL空间为SQL Server,Spatialite SQLite的,等等),他们应该提供的功能,使您能够处理高铁总站.

但是如果要将WKT转换为新Openlayers.Geometry对象(在浏览器中),可以使用以下fromWKT函数:

var point = OpenLayers.Geometry.fromWKT('POINT(-104.74560546875 44.2841796875)');
alert(point.toString()); // POINT(-104.74560546875 44.2841796875)
Run Code Online (Sandbox Code Playgroud)

这里,变量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);
Run Code Online (Sandbox Code Playgroud)

在此之后,collection.toString()应该产生以下结果:

GEOMETRYCOLLECTION(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))


Mar*_*ijn 17

在我的另一个答案中,我和WKT一起去了,因为你提到了它.我现在看到你似乎更喜欢GeoJSON.

要将矢量图层或Openlayers.Geometry对象转换为GeoJSON字符串,您应该使用OpenLayers.Format.GeoJSON.write函数:

var geoJSON = new OpenLayers.Format.GeoJSON(),
    geoJSONText = geoJSON.write(geometryObject);
Run Code Online (Sandbox Code Playgroud)

请注意,您应该能够将对象传递给此函数,因为(根据文档)它接受OpenLayers.Feature.Vector以及OpenLayers.Geometry或一系列功能.

相反,当您有一个GeoJSON字符串时,可以使用OpenLayers.Format.GeoJSON.read函数将其转换回对象:

var geometry = geoJSON.read(geoJSONText, 'Geometry');
Run Code Online (Sandbox Code Playgroud)

第二个参数用于指示您要返回的对象类型.阅读链接的文档以获取更多信息.

另外,请查看此演示以获取更广泛的示例.(查看页面的来源以了解他们是如何做到的).