2011-03-04 62 views
15

背景:我是OpenLayers的一個剛剛營業的新手,請溫和。保存和恢復OpenLayers中的幾何圖形

基本上,我有一個地圖上有一些繪製的對象。如果我理解正確,我有許多OpenLayer.Feature.Vector(圖層?)和許多OpenLayer.Geometry「事物」(如LinearRing)。

目前,我似乎能夠使用.toString()獲得幾何體的很好表示。是的,我懷疑我做錯了 - 隨時指出我正確的方向。

這產生了非常人類可讀和數據庫可存儲,字符串如:

  • 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.5585 9375,-104.65771484375 45.20703125)

有沒有讓這些到對象格式從那裏他們來到的逆方式?

我很想使用JSON,但似乎無法讓GeoJSON接受我的OpenLayer.Feature.Vector對象(這是CLASS_NAME屬性在我內部進行同步時所說的)。

非常感謝。

回答

29

Openlayers.Geometry對象'toString方法很好地將它們轉換爲WKT(衆所周知的文本)。如果您在數據庫之上使用GIS層(例如PostGres的PostGIS,SQL Server的SQL Spatial,SQLite的Spatialite等),它們應該提供使您能夠處理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 ),LINESTRING(-105.71240234375 44.6796875,-106.06396484375 42.658203125,-103.55908203125 42.7021484375,-103.47119140625 45.55859375,-104.65771484375 45。20703125))

+0

謝謝,謝謝,謝謝!這正是我所需要的,正是我所需要的細節水平! – 2011-03-04 15:55:54

+0

@WaltStoneburner:不客氣。我只是在探索OpenLayers的WKT支持。 :-) – Martijn 2011-03-04 16:18:07

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或一系列功能。

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

第二個參數,您可以指定希望返回的對象類型:

相反,當你有一個GeoJSON的字符串,可以使用OpenLayers.Format.GeoJSON.read功能轉換回對象。閱讀鏈接的文檔以獲取更多信息。

此外,請參閱this demo以獲得更廣泛的示例。 (查看頁面的來源,看看他們是如何做的)。

+0

非常好的跟進!這太棒了。 – 2011-03-04 15:56:38

+1

@WaltStoneburner:我同意,OpenLayers_is_輝煌。只是一點點沒有記錄。 – Martijn 2011-03-04 16:38:43

+0

請注意那些後面,我實際上不得不這樣做:var geoJSON = new OpenLayers.Format.GeoJSON()。write(geometryObject); – 2011-03-04 19:13:59