6

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

我已经尝试了几个小时的谷歌搜索,但找不到任何可以显示一些基本地理空间信息的文档,例如使用 Doctrine2 获取两点之间的距离。在确定我选择的数据库方面,不能使用 ORM 对我来说是一件大事。

有人可以向我展示一个基本示例,例如使用 Doctrine 显示半径为 10 英里的所有点吗?

4

2 回答 2

9

我在我的博客上写了一篇文章,解释了如何使用 Doctrine 2(2.2+ 版本)和 Postgis。这篇文章是法语的,但代码是 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. 对象点转换为 WKT。为什么是 WKT 而不是 json ?因为 Postgis 有一个 ST_GeogFromWKT 函数,但(还没有)一个 ST_GeogFromGeoJson 函数。
  2. 数据被插入到数据库中。

我还编写了一个自定义 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());
于 2012-08-30T10:24:40.663 回答
3

我知道这有点旧,但可能对其他人有所帮助。

我找到了这个库:

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

他们支持 Postgis 和 MySQL。

Postgis 的功能是:

  • ST_Area
  • ST_AsBinary
  • ST_AsText
  • ST_Centroid
  • ST_最近点
  • ST_包含
  • ST_ContainsProperly
  • ST_CoveredBy
  • ST_封面
  • ST_Crosses
  • ST_不相交
  • ST_Distance
  • ST_信封
  • ST_GeomFromText
  • ST_Length
  • ST_LineCrossingDirection
  • ST_起点
  • ST_总结
于 2015-04-25T15:35:42.543 回答