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

上一篇: MySQL latitude and Longitude table setup

下一篇: Database/SQL: How to store longitude/latitude data?