2017-02-06 342 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。这样做会将点完全放在边界上。