首页 > 解决方案 > 嵌套数组正在更改为从 JavaScript 到 Rails 的一串值

问题描述

使用 OpenLayers(虽然我认为这是一个 JS/Rails 问题)我画了一个盒子,

var source = new VectorSource();

function addInteraction() {
  var draw = new Draw({
    source: source,
    type: 'Circle',
    geometryFunction: createBox()
  });
  map.addInteraction(draw);
  draw.on('drawend', function(event) {
    var boxCoords = event.feature.getGeometry().getCoordinates()
    console.log(" boxCoords: ", boxCoords);
    document.getElementById('year_snippet_extent').innerHTML = boxCoords;
  });
}

addInteraction();

控制台日志输出(矩形的四个角,但又回到开头,OpenLayers就是这样处理画框的,即多边形):

 boxCoords:  
 [Array(5)]
 0: Array(5)
 0: (2) [977.8497980044467, 710.486212043731]
 1: (2) [1341.059647947079, 710.486212043731]
 2: (2) [1341.059647947079, 754.3238572469668]
 3: (2) [977.8497980044467, 754.3238572469668]
 4: (2) [977.8497980044467, 710.486212043731]

将什么写入year_snippet_extent编辑表单上的字段:977.8497980044467,710.486212043731,1341.059647947079,710.486212043731,1341.059647947079,754.3238572469668,977.8497980044467,754.3238572469668,977.8497980044467,710.486212043731

我想将它作为数组保存到 Postgres。Postgres 数据类型是 text [],Rails 数据类型是相同的,虽然我的迁移是数组,add_column :years, :snippet_extent, :text, array:true.

编辑中的字段是<%= form.input :snippet_extent, label: 'Automatically filled when snippet is drawn' %>

什么是重新格式化阵列?还是我应该使用不同的方法?

我不知道如何直接box_coords保存snippet_extent,所以想出了这个解决方法。我可以解析为我的目的而保存的内容,但我认为我应该能够正确地完成这项工作。

这是我写的以获得我认为正确的格式(我只需要左下角和右上角):

 var minx = Math.round(boxCoords.[0].[0].[0])
 var miny = Math.round(boxCoords.[0].[0].[1])
 var maxx = Math.round(boxCoords.[0].[2].[0])
 var maxy = Math.round(boxCoords.[0].[2].[1])
 var snippetExtent = "{[[" + String(minx) + "," + String(miny) + "],[" + String(maxx) + "," + String(maxy) + "]]}"

没那么难,但我希望没有必要。我正在四舍五入以使其更易于阅读,并且精度毫无意义。

标签: javascriptruby-on-railsopenlayers

解决方案


我们正在使用传单,但我们正在做一些非常相似的事情:在绘制几何图形时,我们会显示一个带有表单的模态,并且我们设置一个隐藏的文本字段来包含几何图形。

我们正在使用 postgis,因此我们立即将 geojson 表示存储在该隐藏字段中。不太确定是否可以使用 OpenLayers(很确定是这样,只是没有立即找到它)。但也许这对你来说不是最简单的格式?如果您使用的是 postgis 和 activerecord-postgis gem,则只需将 geojson 分配给几何。

但如果没有,你将不得不自己解析一个geojson(这不是太难,但肯定会稍微复杂一些)。

因此,正如评论中提到的:JSON 是一种更好的交换格式,总是在 API 中使用,因为 JS 和 Rails 都可以很好地处理它。

所以在你的JS中你可以写:

document.getElementById('year_snippet_extent').innerHTML = JSON.stringify(boxCoords);

并且在导轨末端,您可以将其转换回放入其中的任何内容,如下所示:

box_coords = JSON.parse(params[:year_snippet_extent])

推荐阅读