Symfony Postgresql Postgis 查找周围元素

问题描述 投票:0回答:1

我正在尝试使用 postgis 来查找某个点周围的一些东西,距离以米表示。

我使用的是 Symfony 6.3.7、doctrinebundle 2.10、postresql 13 和 postgis 3.0 我还安装了用于学说扩展的 jsor 包,这是我的conf:

    orm:
        dql:
            string_functions:
                ST_DWithin: Jsor\Doctrine\PostGIS\Functions\ST_DWithin
                ST_SetSRID: Jsor\Doctrine\PostGIS\Functions\ST_SetSRID
                ST_POINT: Jsor\Doctrine\PostGIS\Functions\ST_Point
                ST_GeomFromText: Jsor\Doctrine\PostGIS\Functions\ST_GeomFromText
                ST_Transform: Jsor\Doctrine\PostGIS\Functions\ST_Transform
                geometry: Jsor\Doctrine\PostGIS\Functions\Geometry
                geography: Jsor\Doctrine\PostGIS\Functions\Geography

我的数据库中有两个带有经度和纬度的列。 我使用以下请求创建了 DoctrineMigration 来创建点列。 我选择 SRID 4326 因为它看起来很常见,但它可能不是最适合我的情况

$this->addSql('CREATE EXTENSION IF NOT EXISTS postgis;');
$this->addSql('ALTER TABLE myTable ADD point geometry(GEOMETRY, 4326)');
$this->addSql('UPDATE myTable SET point = ST_SetSRID(ST_Point(longitude, latitude), 4326)');

使用原始sql,类似

SELECT * FROM myTable WHERE ST_DWithin(ST_SetSRID(point, 4326)::geography, ST_GeomFromText('POINT(4.137325 46.691456)', 4326)::geography, 20000)
之类的东西似乎可以工作,但它可能没有优化。

我正在努力使用查询构建器来搜索周围给定区域中的元素。 我想按邻近程度排序。

我该怎么做?

postgresql symfony postgis
1个回答
0
投票

最终创建了地理列而不是几何图形,以避免转换

'ALTER TABLE Creche ADD point geography(point, 4326)'

对于查询,使用 $qb->expr()->eq 似乎可以使其工作。

$exp = "n.point, ST_GeomFromText('" . $entity->getPoint() . "', 4326)";
$qb = $this->createQueryBuilder('n');    
$queryBuilder = $qb
            ->addSelect('st_distance('.$exp.') as distance')
            ->where($qb->expr()->eq("ST_DWithin($exp, " . $rayon * 1000 . ")","true"))
            ->orderBy('distance', 'asc')
            ->setMaxResults(10);
© www.soinside.com 2019 - 2024. All rights reserved.