我正在尝试使用 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)
之类的东西似乎可以工作,但它可能没有优化。
我正在努力使用查询构建器来搜索周围给定区域中的元素。 我想按邻近程度排序。
我该怎么做?
最终创建了地理列而不是几何图形,以避免转换
'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);