如何使用Doctrine2和PostGIS一起处理地理空间查询?

6

我有一个基于Postgres和PostGIS的公共应用程序。

我已经试图谷歌搜索了几个小时,但一直找不到任何文档能够展示像使用Doctrine2获取两个点之间距离这样的基本地理空间相关操作。不能使用ORM对我来说是一个很大的问题,因为它决定了我的数据库选择。

能否有人向我展示一个基本的例子,比如使用Doctrine显示所有在10英里半径内的点?

2个回答

9

我在我的博客上写了一篇文章,解释如何使用Doctrine 2(版本2.2+)和Postgis。这篇文章是用PHP编写的,PHP是一种国际语言:

http://web.archive.org/web/20161118060448/http://blog.fastre.info:80/2012/02/doctrine2-2-2-et-types-geographiques/

如您所见,从数据库导入数据到对象需要进行一些转换:
  1. 数据通过postgis转换为geojson(json可由php读取,使用json_decode函数)
  2. 将数据转换为Point对象
并且从对象的世界到数据库:
  1. 将Point对象转换为WKT。为什么是WKT而不是json?因为Postgis有一个ST_GeogFromWKT函数,但没有(尚未)ST_GeogFromGeoJson函数。
  2. 将数据插入数据库。
我还编写了一个自定义的DQL函数类,处理了DQL查询中的“covered”操作。这不完全符合您的要求,但您可以从中获得灵感并调整代码。
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

注意:要使用此函数,您需要创建其他函数,在其中使用“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());

3

我知道这已经有点老了,但可能有助于其他人。

我找到了这个库:

https://github.com/djlambert/doctrine2-spatial

他们支持Postgis和MySQL。

Postgis函数包括:

  • ST_Area
  • ST_AsBinary
  • ST_AsText
  • ST_Centroid
  • ST_ClosestPoint
  • ST_Contains
  • ST_ContainsProperly
  • ST_CoveredBy
  • ST_Covers
  • ST_Crosses
  • ST_Disjoint
  • ST_Distance
  • ST_Envelope
  • ST_GeomFromText
  • ST_Length
  • ST_LineCrossingDirection
  • ST_StartPoint
  • ST_Summary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接