获取地理空间点 st_within 矩形的 DQL 查询
DQL query for getting geo spatial points st_within a rectangle
我想将 DQL 查询写入 select 地图中矩形内的所有点。矩形由左上角点和右下角点定义。有关详细信息,请参阅此 link。
为此,我编写了这个 DQL 查询:
$qb = $this->em->createQueryBuilder()
->select("m")
->from($this->getEntityClassName(), "m")
->where("ST_Within(m.geom, envelope(linestring(:topleft, :bottomright)))")
->setParameter(":topleft", $topleft)
->setParameter(":bottomright", $bottomright)
->orderBy("m.date", "DESC");
我得到的错误是:
[Syntax Error] line 0, col 110: Error: Expected =, <, <=, <>, >, >=, !=, got 'ORDER'
请注意,我正在查询的实体具有定义如下的 geom 属性:
/**
* @var point $geom
* @ORM\Column(type="point", nullable=true)
*/
protected $geom;
请注意,SQL 查询运行良好。具体如下:
SELECT *FROM MotorsAds WHERE
st_within(point(lng, lat),
envelope(linestring(point(10.090792984008772,36.83717099338201 ),
point(10.310519546508772,36.749467295867646 ))))
我用于 DQL 数字函数(例如我们 st_within
)的库是 creof/doctrine2-spatial。
准备接受任何解决该问题的建议。
谢谢,
问题更新
我尝试了您提出的解决方案如下:
$qb = $this->em->createQueryBuilder()
->select("m")
->from($this->getEntityClassName(), "m")
->where(
$this->em->createQueryBuilder()->expr()->eq(
"ST_Within(m.geom, envelope(linestring(:topleft, :bottomright)))",
$this->em->createQueryBuilder()->expr()->literal(true)
)
)
->setParameter(":topleft", $topleft)
->setParameter(":bottomright", $bottomright)
->orderBy("m.date", "DESC");
所以,我得到的错误是:
使用参数 [{}, {}] 执行 'SELECT COUNT(*) AS dctrn_count FROM (SELECT DISTINCT id_0 FROM (SELECT m0_.id AS id_0, m0_.price AS price_1, m0_.year AS year_2, m0_.km AS km_3, m0_.slug AS slug_4, m0_.title AS title_5, m0_.description AS description_6, m0_.address AS address_7, m0_.isPublished AS isPublished_8, m0_.delegation AS delegation_9, m0_.lat AS lat_10, m0_.lng AS lng_11, m0_.date AS date_12, m0_.count AS count_13, AsBinary(m0_.geom) AS geom_14 FROM MotorsAds m0_ WHERE ST_Within(m0_.geom, Envelope(LineString(?, ?))) = 1 ORDER BY m0_.date DESC) dctrn_result) dctrn_table' 时发生异常:
SQLSTATE[22007]: 无效的日期时间格式:1367 非法非几何 ''10.090792984009 36.837170993382'' 在解析过程中发现的值
试试这个:
$qb = $this->em->createQueryBuilder()
->select("m")
->from($this->getEntityClassName(), "m")
->where(
$queryBuilder->expr()->eq(
"ST_Within(m.geom, envelope(linestring(:topleft, :bottomright)))",
$queryBuilder->expr()->literal(true)
)
)
->setParameter(":topleft", $topleft)
->setParameter(":bottomright", $bottomright)
->orderBy("m.date", "DESC");
我从文档中获取的:https://github.com/creof/doctrine2-spatial/blob/master/doc/index.md
下面的解决方案将防止您将 PHP 点转换为 DQL 查询点的问题。
$qb = $this->em->createQueryBuilder()
->select("m")
->from($this->getEntityClassName(), "m")
->where(
$this->em->createQueryBuilder()->expr()->eq(
sprintf("ST_Within(m.geom, envelope(linestring(point(:topleftX,:topleftY), point(:bottomrightX,:bottomrightY ))))"),
$this->em->createQueryBuilder()->expr()->literal(true)
)
)
->setParameter(":topleftX", $topleftX)
->setParameter(":topleftY", $topleftY)
->setParameter(":bottomrightX", $bottomrightX)
->setParameter(":bottomrightY", $bottomrightY)
->orderBy("m.date", "DESC");
我想将 DQL 查询写入 select 地图中矩形内的所有点。矩形由左上角点和右下角点定义。有关详细信息,请参阅此 link。
为此,我编写了这个 DQL 查询:
$qb = $this->em->createQueryBuilder()
->select("m")
->from($this->getEntityClassName(), "m")
->where("ST_Within(m.geom, envelope(linestring(:topleft, :bottomright)))")
->setParameter(":topleft", $topleft)
->setParameter(":bottomright", $bottomright)
->orderBy("m.date", "DESC");
我得到的错误是:
[Syntax Error] line 0, col 110: Error: Expected =, <, <=, <>, >, >=, !=, got 'ORDER'
请注意,我正在查询的实体具有定义如下的 geom 属性:
/**
* @var point $geom
* @ORM\Column(type="point", nullable=true)
*/
protected $geom;
请注意,SQL 查询运行良好。具体如下:
SELECT *FROM MotorsAds WHERE
st_within(point(lng, lat),
envelope(linestring(point(10.090792984008772,36.83717099338201 ),
point(10.310519546508772,36.749467295867646 ))))
我用于 DQL 数字函数(例如我们 st_within
)的库是 creof/doctrine2-spatial。
准备接受任何解决该问题的建议。
谢谢,
问题更新
我尝试了您提出的解决方案如下:
$qb = $this->em->createQueryBuilder()
->select("m")
->from($this->getEntityClassName(), "m")
->where(
$this->em->createQueryBuilder()->expr()->eq(
"ST_Within(m.geom, envelope(linestring(:topleft, :bottomright)))",
$this->em->createQueryBuilder()->expr()->literal(true)
)
)
->setParameter(":topleft", $topleft)
->setParameter(":bottomright", $bottomright)
->orderBy("m.date", "DESC");
所以,我得到的错误是:
使用参数 [{}, {}] 执行 'SELECT COUNT(*) AS dctrn_count FROM (SELECT DISTINCT id_0 FROM (SELECT m0_.id AS id_0, m0_.price AS price_1, m0_.year AS year_2, m0_.km AS km_3, m0_.slug AS slug_4, m0_.title AS title_5, m0_.description AS description_6, m0_.address AS address_7, m0_.isPublished AS isPublished_8, m0_.delegation AS delegation_9, m0_.lat AS lat_10, m0_.lng AS lng_11, m0_.date AS date_12, m0_.count AS count_13, AsBinary(m0_.geom) AS geom_14 FROM MotorsAds m0_ WHERE ST_Within(m0_.geom, Envelope(LineString(?, ?))) = 1 ORDER BY m0_.date DESC) dctrn_result) dctrn_table' 时发生异常:
SQLSTATE[22007]: 无效的日期时间格式:1367 非法非几何 ''10.090792984009 36.837170993382'' 在解析过程中发现的值
试试这个:
$qb = $this->em->createQueryBuilder()
->select("m")
->from($this->getEntityClassName(), "m")
->where(
$queryBuilder->expr()->eq(
"ST_Within(m.geom, envelope(linestring(:topleft, :bottomright)))",
$queryBuilder->expr()->literal(true)
)
)
->setParameter(":topleft", $topleft)
->setParameter(":bottomright", $bottomright)
->orderBy("m.date", "DESC");
我从文档中获取的:https://github.com/creof/doctrine2-spatial/blob/master/doc/index.md
下面的解决方案将防止您将 PHP 点转换为 DQL 查询点的问题。
$qb = $this->em->createQueryBuilder()
->select("m")
->from($this->getEntityClassName(), "m")
->where(
$this->em->createQueryBuilder()->expr()->eq(
sprintf("ST_Within(m.geom, envelope(linestring(point(:topleftX,:topleftY), point(:bottomrightX,:bottomrightY ))))"),
$this->em->createQueryBuilder()->expr()->literal(true)
)
)
->setParameter(":topleftX", $topleftX)
->setParameter(":topleftY", $topleftY)
->setParameter(":bottomrightX", $bottomrightX)
->setParameter(":bottomrightY", $bottomrightY)
->orderBy("m.date", "DESC");