嵌套数组正在更改为从 JavaScript 到 Rails 的值字符串

A nested array is changing to a string of values going from JavaScript to 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();

控制台日志输出(矩形的四个角,但是returns到开头,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 数据类型是文本 [],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) + "]]}"

没那么难,但我希望没有必要。我四舍五入是为了让它更容易阅读,精度是没有意义的。

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

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

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

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

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

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

并且在 rails 结束时,您可以将其转换回放入其中的任何内容,如下所示:

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