我有一个基于 Postgres 和 PostGIS 的面向公众的应用程序。
我已经尝试了几个小时的谷歌搜索,但找不到任何可以显示一些基本地理空间信息的文档,例如使用 Doctrine2 获取两点之间的距离。在确定我选择的数据库方面,不能使用 ORM 对我来说是一件大事。
有人可以向我展示一个基本示例,例如使用 Doctrine 显示半径为 10 英里的所有点吗?
我有一个基于 Postgres 和 PostGIS 的面向公众的应用程序。
我已经尝试了几个小时的谷歌搜索,但找不到任何可以显示一些基本地理空间信息的文档,例如使用 Doctrine2 获取两点之间的距离。在确定我选择的数据库方面,不能使用 ORM 对我来说是一件大事。
有人可以向我展示一个基本示例,例如使用 Doctrine 显示半径为 10 英里的所有点吗?
我在我的博客上写了一篇文章,解释了如何使用 Doctrine 2(2.2+ 版本)和 Postgis。这篇文章是法语的,但代码是 PHP,这是一种国际语言:
正如您将看到的,将数据从数据库导入到对象需要一些转换:
从对象的世界到数据库:
我还编写了一个自定义 DQL 函数类,用于处理 DQL 查询中的“覆盖”操作。这并不完全是您所要求的,但您可能会从中得到启发并调整代码。
namespace Progracqteur\WikipedaleBundle\Resources\Doctrine\Functions;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
/**
*
* @author Julien Fastré <julien arobase fastre point info>
*/
class Covers extends FunctionNode {
private $polygon = null;
private $point = null;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) {
return 'ST_Covers('.$this->polygon->dispatch($sqlWalker).', '.$this->point->dispatch($sqlWalker).')';
}
public function parse(\Doctrine\ORM\Query\Parser $parser) {
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->polygon = $parser->StringExpression();
$parser->match(Lexer::T_COMMA);
$this->point = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
并使用 app/config/config.yml 将此功能添加到学说中:
dql:
string_functions:
covers: Progracqteur\WikipedaleBundle\Resources\Doctrine\Functions\Covers
注意:要使用此函数,您必须创建其他函数,这些函数之前将使用“ST_FromWKT”函数,并在 getSql 中将您的点转换为 WKT(使用 __toString 函数?)。我的应用程序中不需要它,所以我没有代码可以展示给你。
这是使用我的函数的示例:($entity->getPolygon() 返回 postgis 的字符串,无需任何转换 - 我不需要在我的应用程序中处理多边形的对象。)
$em->createQuery('SELECT p from MyEntity p where covers(:polygon, p.geom) = true)
->setParameter('polygon', $entity->getPolygon());
我知道这有点旧,但可能对其他人有所帮助。
我找到了这个库:
https://github.com/djlambert/doctrine2-spatial
他们支持 Postgis 和 MySQL。
Postgis 的功能是: