1

将 PostgreSQL 点转换为"(5.035,1)"to格式的最有效方法是{x: 5.035, y: 1}什么?

我用 PHP 写的函数看起来像

function pointToArray($point) {
    if ( strlen($point) == 0 ) return null;

    $xy = explode(",", substr($point, 1, strlen($point)-2));

    return array(
        "x" => $xy[0], 
        "y" => $xy[1]
    );
}
4

4 回答 4

3

您可以在 Javascript 中使用与在 PHP 中相同的方法:

function pointToObject(point) {
  if(!point.length) return null;
  var split = point.slice(1, -1).split(",");
  return {
    x: +split[0],
    y: +split[1]
  };
}

我刚刚做的一个简单的基准测试能够在 1.53 秒内执行这个函数 200 万次。

而且,为了更好的衡量,这是一个从 NullUserException 无耻地窃取的正则表达式解决方案,在大多数浏览器上速度略快

function conv(s) { 
   var rx = /\(([^,]+),\s*([^)]+)\)/g; 
   var m = rx.exec(s); 
   return (!m ? null : { x: +m[1], y: +m[2]}); 
}
于 2012-09-29T20:55:29.487 回答
1

假设问题中的那个ST_X意味着可以使用和提取数字的地理点ST_Y。然后可以使用 Postgres 的字符串连接(如果使用当前版本,则使用其 JSON 函数)重新组合这些值。

在 SQL 中进行转换可能比使用 JavaScript 的 PHP 更快、更可靠。

于 2012-09-29T21:02:35.297 回答
1

这避免了为拆分创建字符串数组的开销:

function pointToObject(point) {
   var i = point.indexOf(",");
   if(i==-1) return null;
   return {
     x: point.substr(1, i-1),
     y: point.substr(i+1, point.length-i-2)
   }
}
于 2012-09-29T21:20:23.860 回答
0

这很短,但很讨厌,利用了(x, y)有点像参数列表的事实:

function c(x, y) {
    return {x:x, y:y};
};

p = "(5.035, 1)";
a = eval("c" + p);
于 2012-09-29T20:49:33.297 回答