Distance 如何使用Openlayers 3计算圆边界的坐标

Distance 如何使用Openlayers 3计算圆边界的坐标,distance,openlayers-3,geometry,point,Distance,Openlayers 3,Geometry,Point,我有一个给定半径的点特征,比如说1000米。我计算造型函数内部的半径,如下所示: var givenRadius = 1000; var coords = feature.getGeometry().getCoordinates(); var projection = map.view.getProjection(); var resolutionAtCoords = projection.getPointResolution(re

我有一个给定半径的点特征,比如说1000米。我计算造型函数内部的半径,如下所示:

        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);
显示的圆看起来不错-我通过在地图上测量其半径来检查它

现在我想在它上面做两个标记-在它的中心和边界上。我是这样做的:

        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,与半径大小或地图缩放无关)-请参见图片。计算有什么问题


根据代码外观,您正在使用
givenRadius
resolutionCoords
计算圆半径。但是,在计算边界点时,您正在将硬编码的
givenRadius
添加到
center
。因此,每次它向中心增加1000米。 相反,您必须将
featureStyleRadius
添加到
center

 center[0] += featureStyleRadius;

看起来问题与EPSG:3857投影相关的地图失真有关。我通过将中心坐标转换为EPSG:4326,计算此投影中的边界点位置并转换回EPSG:3857解决了这个问题。这样做会将点精确地放置在边界上。

我认为,这是正确的-中心变量包含坐标-根据投影,它以米为单位。这就是为什么我要加上1000米的半径——我希望这能给我边界的地理坐标。关于圆,OpenLayers不能以米为单位指定圆半径-必须使用屏幕像素。这就是为什么我每次在样式设置函数中都会重新计算圆的半径。如果使用的投影单位为米,则创建
ol.geom.circle
时的
radius
选项也将仅以米为单位。因此,您使用
resolutionacoords
Sumanth不必要地计算半径-这对我来说是一个有趣的信息。我没有“动态”创建我的特征,我使用geojson作为源,geomerty类型是“点”(据我所知geojson没有圆几何类型),我通过点的样式指定半径。由于这是一个大约有1年历史的项目,因此该样式的半径被认为是以像素为单位的(在缩放操作期间它没有变化),这就是我使用calculation.Hi的原因。我也面临同样的问题。你能把答案贴出来吗?