获取MySQL Geo Point数据并将结果存储在PHP变量中

时间:2014-07-11 03:54:36

标签: php mysql

我的目标是将一些点数据插入MySQL数据库。我用一些虚拟数据填充数据库,它似乎工作。稍后,我想检索该数据并将其存储在PHP变量中,以便我可以发布数据的html表。

  Point   X   Y
   P1     1   1
   P2     4   2

注意:请不要讨厌"艺术"。

我使用以下查询字符串从MySQL数据库中检索数据。我在非基于点的数据中使用了这个代码并且没有问题,运行得很好。

$sql = "SELECT * FROM " . $this->tableName . " WHERE `OTHER` = '" . $Otherdata . "' AND `POSITION` = 'POINT(1,1)' LIMIT 0, 30 ";
    $query = mysqli_query($connection, $sql) or trigger_error("Query Failed: " . mysql_error());

    $row = mysqli_fetch_assoc($query);

    //print_r($row);//This is empty, or null...which means my $sql line is wrong too...

    $Index = 0;
    while ($row = mysqli_fetch_array($query, MYSQL_ASSOC)) {
        $this->PositionX[$Index] = $row['POSITION']; //Error must be HERE!                  
        $this->PositionY[$Index] = $row['POSITION']; // How do I access .X() or [0] or whatever it 
        $this->OtherVariable[$Index] = $row['OTHER']; // is that points to the first element of Point?
        $Index++;
    }

长话短说,这不起作用。 $ row [' POSITION']不知道我想要X组件。 $ row也是null或空,这意味着我的$ sql必须是正确的。

问题1:

检查Point(x,y)是否等于MySQL中DB的某个点的正确方法是什么?

修改:找到答案Here。 ' POINT(1,1)'查询的一部分实际上应该是POINT(1,1),即没有' 字符。正确的行显示:

$sql = "SELECT * FROM " . $this->tableName . " WHERE `OTHER` = '" . $Otherdata . "' AND `POSITION` = POINT(1,1) LIMIT 0, 30 ";

问题2:

从MySQL数据库中检索一段点数据并将其存储在PHP变量中的X和Y组件的语法是什么? (技术上两个php变量,一个用于X,一个用于Y,但你知道我的意思。)

另一种说法,我怎样才能调用echo $row['POSITION'];(对于X和Y独立)?

2 个答案:

答案 0 :(得分:3)

我最终使用了As关键字。

"SELECT X(`POSITION`) as Xpos, Y(`POSITION`) as Ypos, `Other1`, `Other2`, `Other3`, `Other4` FROM " . $this->tableName . " WHERE `Other4` = '" . $Otherdata . ";

这让我只能访问Point的一个组件。

$myXpos = $row['Xpos'];
$myYpos = $row['Ypos'];

因此独立访问Point数据类型对象的X和Y组件。

答案 1 :(得分:2)

我最近一直在处理相同的问题,尽管上面的方法确实有效,但对于任何想要从二进制数据blob中提取坐标的人(例如,从“ fetch_assoc”接收的),那么此方法应该工作:

function rawPointToFloatPair($data)
{   
    $res = unpack("lSRID/CByteOrder/lTypeInfo/dX/dY", $data);
    return [$res['X'],$res['Y']];
}

数据结构具有4个字节作为ID,后跟一个字节来定义字节顺序(0 =大字节序,1 =小字节序。为了简洁起见,此处未进行处理),然后是4个字节的“整数信息”(其中a值“ 1”表示这是一个点)。 接下来的16个字节是两个双精度浮点数。