MySQL经纬度表设置

MySQL经纬度表设置,mysql,spatial,latitude-longitude,Mysql,Spatial,Latitude Longitude,我想在mysql数据库表中存储位置的纬度和经度值。考虑到未来,我希望能够在特定位置的特定半径内找到这些地方。话虽如此,我应该在哪些数据类型中存储纬度和经度值?请为以下列提供创建表脚本: place_id | lat | long 上表中是否有我遗漏的一列,可以为我提供当前可能不需要的其他信息 谢谢您的帮助。您应该将点存储在数据类型点的单个列中,您可以使用空间索引对其进行索引(如果您的表类型是MyISAM): 创建空间索引sx\u place\u位置对位置(位置) 挑选* 从mytabl

我想在mysql数据库表中存储位置的纬度和经度值。考虑到未来,我希望能够在特定位置的特定半径内找到这些地方。话虽如此,我应该在哪些数据类型中存储纬度和经度值?请为以下列提供创建表脚本:

place_id  |  lat  |  long
上表中是否有我遗漏的一列,可以为我提供当前可能不需要的其他信息


谢谢您的帮助。

您应该将点存储在数据类型
的单个列中,您可以使用
空间索引对其进行索引(如果您的表类型是
MyISAM
):

创建空间索引sx\u place\u位置对位置(位置)
挑选*
从mytable
其中包含
(
线绳
(
点($x-$radius,$y-$radius),
点($x+$radius,$y+$radius)
)
位置
)

距离(点($x,$y),位置)我花了几个小时浏览了大量的主题,却找不到任何查询,返回以公里为半径的点。ST_Distance_Sphere可以做到这一点,但是,服务器是MariaDB 5.5,不支持ST_Distance_Sphere()

我的解决方案与原则2.5和空间图书馆原则兼容:

    $sqlPoint = sprintf('POINT(%f %f)', $lng, $lat);

    $rsm = new ResultSetMappingBuilder($this->manager);
    $rsm->addRootEntityFromClassMetadata('ApiBundle\\Entity\\Place', 'p');

    $query = $this->manager->createNativeQuery(
        'SELECT p.*, AsBinary(p.location) as location FROM place p ' .
        'WHERE (6371 * acos( cos( radians(Y(ST_GeomFromText(?))) ) ' .
        '* cos( radians( Y(p.location) ) ) * cos( radians( X(p.location) ) ' .
        '- radians(X(ST_GeomFromText(?))) ) + sin( radians(Y(ST_GeomFromText(?))) ) * sin( radians( Y(p.location) ) ) )) <= ?',
        $rsm
    );

    $query->setParameter(1, $sqlPoint, 'string');
    $query->setParameter(2, $sqlPoint, 'string');
    $query->setParameter(3, $sqlPoint, 'string');
    $query->setParameter(4, $radius, 'float');

    $result = $query->getResult();
$sqlPoint=sprintf('POINT(%f%f)'、$lng、$lat);
$rsm=新结果映射生成器($this->manager);
$rsm->addRootEntityFromClassMetadata('ApiBundle\\Entity\\Place','p');
$query=$this->manager->createNativeQuery(
'选择p.*,作为二进制文件(p.location)作为位置p'中的位置'。
'其中(6371*acos(cos(弧度(Y(ST_)))'”。
“*cos(弧度(Y(p.location)))*cos(弧度(X(p.location))”。

'-radians(X(ST_GeomFromText(?))+sin(radians(Y(ST_GeomFromText(?)))*sin(radians(Y(p.location)))我所有的表都使用InnoDB,就像我使用外键一样。InnoDB和MyISAM中都有表不是问题吗?@Martin:
MyISAM
是无事务的,您不能对其使用
外键
约束。对于仅
选择
查询,混合不同类型的表没有问题。是的,我理解foreign键在MyISAM中不起作用,但是如果我有一个额外的坐标表,并且有了它,因为MyISAM和我的所有其他表都是InnoDB,这不是问题吗?@Martin:
插入mytable值(点(51.48484804,0.296631))
。对于早期版本的
MySQL
5.0
,可能还有一些早期的
5.1
)这可能需要
WKT
这样的翻译:
插入mytable值(GeomFromText('POINT(51.484804,0.296631))
。如果您的所有点都在英国,我建议您在zone
30
中使用
UTM
坐标。新版MySQL支持innodb上的spatial:
    $sqlPoint = sprintf('POINT(%f %f)', $lng, $lat);

    $rsm = new ResultSetMappingBuilder($this->manager);
    $rsm->addRootEntityFromClassMetadata('ApiBundle\\Entity\\Place', 'p');

    $query = $this->manager->createNativeQuery(
        'SELECT p.*, AsBinary(p.location) as location FROM place p ' .
        'WHERE (6371 * acos( cos( radians(Y(ST_GeomFromText(?))) ) ' .
        '* cos( radians( Y(p.location) ) ) * cos( radians( X(p.location) ) ' .
        '- radians(X(ST_GeomFromText(?))) ) + sin( radians(Y(ST_GeomFromText(?))) ) * sin( radians( Y(p.location) ) ) )) <= ?',
        $rsm
    );

    $query->setParameter(1, $sqlPoint, 'string');
    $query->setParameter(2, $sqlPoint, 'string');
    $query->setParameter(3, $sqlPoint, 'string');
    $query->setParameter(4, $radius, 'float');

    $result = $query->getResult();