背景:我是OpenLayers的一个只有几个小时的新手,请保持温和。
从根本上说,我有一张地图上有一些绘制的物体。如果我理解正确,我有许多OpenLayer.Feature.Vector(layers?),上面有许多OpenLayer.Geometry“的东西”(比如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属性在我进入内部时所说的内容)。
非常感谢。
答案 0 :(得分:29)
Openlayers.Geometry个对象'toString
方法很好地将它们转换为WKT(众所周知的文本)。如果在数据库顶部使用GIS层(例如PostGIS for PostGres,SQL Spatial for SQL Server,Spatialite for 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(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))
答案 1 :(得分:17)
在我的另一个答案中,我和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');
第二个参数可让您指出要返回的对象类型。阅读链接到的文档以获取更多信息。
另外,请查看this demo以获取更广泛的示例。 (查看页面来源以了解他们是如何做到的)。