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