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



使用OpenLayers(尽管我认为这是JS/RRails的问题(我画了一个框,

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) + "]]}"

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

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

我们使用postgis,所以我们立即将geojson表示存储在该隐藏字段中。不太确定使用OpenLayers是否可能(很确定,只是没有立即找到(。但也许这对你来说不是最简单的格式?如果您使用的是postgis和activerecordpostgisgem,那么您只需为一个几何体分配一个geojson即可。

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

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

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

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

在铁轨末端,你可以将其转换回放入其中的任何东西,如下所示:

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

最新更新