我有一个基于Postgres和PostGIS的公共应用程序。
我已经试图谷歌搜索了几个小时,但一直找不到任何文档能够展示像使用Doctrine2获取两个点之间距离这样的基本地理空间相关操作。不能使用ORM对我来说是一个很大的问题,因为它决定了我的数据库选择。
能否有人向我展示一个基本的例子,比如使用Doctrine显示所有在10英里半径内的点?
我有一个基于Postgres和PostGIS的公共应用程序。
我已经试图谷歌搜索了几个小时,但一直找不到任何文档能够展示像使用Doctrine2获取两个点之间距离这样的基本地理空间相关操作。不能使用ORM对我来说是一个很大的问题,因为它决定了我的数据库选择。
能否有人向我展示一个基本的例子,比如使用Doctrine显示所有在10英里半径内的点?
我在我的博客上写了一篇文章,解释如何使用Doctrine 2(版本2.2+)和Postgis。这篇文章是用PHP编写的,PHP是一种国际语言:
如您所见,从数据库导入数据到对象需要进行一些转换: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 添加到 doctrine 中:
dql:
string_functions:
covers: Progracqteur\WikipedaleBundle\Resources\Doctrine\Functions\Covers
$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函数包括: