2017-02-06 346 views
0

我有一個給定半徑的點要素 - 比方說1000m。我計算半徑喜歡我的造型函數中:如何使用Openlayers計算圓形邊框的座標3

 var givenRadius = 1000; 
     var coords = feature.getGeometry().getCoordinates(); 
     var projection = map.view.getProjection(); 
     var resolutionAtCoords = projection.getPointResolution(resolution, coords); 

     var featureStyleRadius = Math.round(radius/resolutionAtCoords); 

     style.getImage().setRadius(featureStyleRadius); 

顯示圈看起來不錯 - 我通過測量在地圖上它的半徑檢查它。

現在我想在它的中心和邊界上放上2個標記。我不喜歡這樣寫道:

 var center = ol.proj.transform([lon,lat], 'EPSG:4326', 'EPSG:3857'); 

     // center point 

     map.previewLayer.getSource().addFeature(new ol.Feature({ 
       geometry: new ol.geom.Point(center), 
       type: "dragPoint" 
      }) 
     ); 

     // border point 

     center[0] += givenRadius; 

     map.previewLayer.getSource().addFeature(new ol.Feature({ 
       geometry: new ol.geom.Point(center), 
       type: "dragPoint" 
      }) 
     ); 

中心標記的位置正確,但邊界標誌始終是圓內(〜其半徑2/3無論半徑大小或地圖縮放) - 看到的景象。計算有什麼問題?

enter image description here

回答

0

您所使用givenRadiusresolutionAtCoords計算圓半徑的代碼的外觀。但在計算邊界點時,您正在將硬編碼的givenRadius添加到center。所以每次加1000米到中心。 相反,您必須將featureStyleRadius添加到center

center[0] += featureStyleRadius; 
+0

我認爲,這是正確的 - 中心變量包含座標 - 根據投影以米爲單位。這就是爲什麼我添加1000米的給定半徑 - 我期望給我的邊界地理座標。關於圓圈,OpenLayers無法以米爲單位指定圓半徑 - 您必須使用屏幕像素。這就是爲什麼我每次在造型函數內重新計算圓的半徑。 – user3523426

+0

如果使用的投影以米爲單位,則創建「ol.geom.Circle」時的「半徑」選項也將僅以米爲單位。所以你不必要地使用'resolutionAtCoords'計算半徑。 –

+0

Sumanth - 這對我來說是有趣的信息。我不創建我的功能「飛」,我有geojson作爲源,幾何類型是「點」(據我所知geojson沒有圓幾何類型),我指定半徑通過風格的點。由於這是一個大約1年的項目,因此樣式的半徑被認爲是以像素爲單位的(在縮放操作期間它不會改變),這就是我使用計算的原因。 – user3523426

0

看起來問題與EPSG:3857投影相關的地圖失真有關。我通過將中心座標轉換爲EPSG:4326來解決此問題,計算此投影中的邊界點位置並將其轉換回EPSG:3857。這樣做會將點完全放在邊界上。