【问题标题】:Can't save features of drawn Circle to JSON in Openlayers 3无法在 Openlayers 3 中将绘制圆的特征保存到 JSON
【发布时间】:2016-12-20 14:57:06
【问题描述】:

所以,事情是这样的:我想在 OL3 中的地图上画一个圆圈,然后将其保存到 JSON 文件中。据我了解,您无法将圆形几何图形写入 JSON (https://github.com/openlayers/ol3/issues/3552)。我使用 OL3 示例绘制形状并将其更改为使用 ol.geom.Polygon.circular 方法以避免使用圆形几何图形。当我尝试保存它时,我得到“TypeError:循环对象值”。

if (value) {
var geometryFunction, maxPoints;
    if (value === 'Circle') {
        value='Circle';
        maxPoints=2;
        geometryFunction = function (coordinates, geometry) {
        if (!geometry) {
        geometry = new ol.geom.Polygon(null);
                    }
      var center = coordinates[0];
      var last = coordinates[1];
      var dx = center[0] - last[0];
      var dy = center[1] - last[1];
      var radius = Math.sqrt(dx * dx + dy * dy);
      geometry = ol.geom.Polygon.circular(wgs84Sphere, center, radius);
      return geometry;
                }; 
            draw = new ol.interaction.Draw({
                features:features,
                type: value,
                geometryFunction: geometryFunction,
                maxPoints: maxPoints
            });
            map.addInteraction(draw);

这就是我保存 JSON 的方式:

var writer = new ol.format.GeoJSON();
var geojsonStr = writer.writeFeatures(source.getFeatures());
alert(geojsonStr);

我很确定一定有一种方法可以使用 ol.geom.Polygon.fromCircle 或 ol.geom.Polygon.circular 绘制圆并将其保存为 JSON。有什么想法吗?

【问题讨论】:

  • 您是否在特征上存储任何复杂的属性(即字符串或数字除外),例如使用feature.set()?如果不实时查看您的应用程序,很难猜测发生了什么。
  • 这是我的:jsfiddle.net/px6ks0am 因为JSON不能得到圆形几何,所以写的特征是空的。如何完全避免使用圆形或将其转换为多边形?

标签: javascript json openlayers-3


【解决方案1】:

使用自定义geometryFunction 时,您必须使用作为第二个参数传递给几何函数的现有geometry(如果可用)。我更新了你的小提琴:http://jsfiddle.net/px6ks0am/1/

成功的关键是以下geometryFunction,它还负责正确地重新投影圆形多边形:

var wgs84Sphere = new ol.Sphere(6378137);
function geometryFunction(coordinates, geometry) {
  if (!geometry) {
    geometry = new ol.geom.Polygon(null);
  }
  var center = coordinates[0];
  var last = coordinates[1];
  var dx = center[0] - last[0];
  var dy = center[1] - last[1];
  var radius = Math.sqrt(dx * dx + dy * dy);
  var circle = ol.geom.Polygon.circular(wgs84Sphere, ol.proj.toLonLat(center), radius);
  circle.transform('EPSG:4326', 'EPSG:3857');
  geometry.setCoordinates(circle.getCoordinates());
  return geometry;
}

【讨论】:

  • 非常感谢!这是一个有价值的答案!我可以找到一些 ol.geom.Polygon.circular 的 esage 示例,但没有一个涉及实际绘图。欣赏!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多