MySQL纬度和经度表设置
我想将位置的纬度和经度值存储在mysql数据库表中。 考虑到未来,我希望能够在特定位置的特定半径范围内找到这些位置。 话虽如此,我应该存储哪些数据类型的纬度和经度值? 请你能为我提供一个创建表格脚本,如下所示:
place_id | lat | long
在上面的表格中是否有我缺少的专栏,可以为我提供额外的信息,但目前我可能看不到我需要的信息?
谢谢你的帮助。
您应该将这些点存储在数据类型Point
的单列中,您可以使用SPATIAL
索引(如果您的表类型为MyISAM
)索引该列:
CREATE SPATIAL INDEX sx_place_location ON place (location)
SELECT *
FROM mytable
WHERE MBRContains
(
LineString
(
Point($x - $radius, $y - $radius),
Point($x + $radius, $y + $radius)
)
location
)
AND Distance(Point($x, $y), location) <= $radius
这将大大提高查询的速度,如“在给定半径内查找所有内容”。
请注意,最好使用简单的TM
测量坐标(东和北)而不是极坐标(经度和纬度)。 对于小半径,它们足够精确,并且计算大大简化。 如果你所有的点都在一个半角,远离极点,你可以使用一个中央子午线。
当然,您仍然可以使用极坐标,但计算MBR
和距离的公式会更复杂。
我已经通过大量主题挖掘了几个小时,无法找到查询,返回由km定义的半径中的点。 ST_Distance_Sphere可以实现,但是,服务器是MariaDB 5.5,不支持ST_Distance_Sphere()。
管理得到一些工作,所以这里是我的解决方案,与Doctrine 2.5和Doctrine CrEOF空间库兼容:
$sqlPoint = sprintf('POINT(%f %f)', $lng, $lat);
$rsm = new ResultSetMappingBuilder($this->manager);
$rsm->addRootEntityFromClassMetadata('ApiBundleEntityPlace', '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();
假设lng和lat是固定点的XY,Place是具有“位置”字段POINT类型的实体。 由于MySQL的参数绑定问题,我无法直接使用DQL,这就是为什么低级原生查询。 rsm需要将结果映射到实体对象。 尽管如此,可以没有它。
随意使用它。 我希望它能为你节省一些时间。
链接地址: http://www.djcxy.com/p/93907.html