gpt4 book ai didi

symfony - 如何使用PostGIS将Doctrine2与GeoSpatial查询配合使用?

转载 作者:行者123 更新时间:2023-12-04 14:16:18 24 4
gpt4 key购买 nike

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

我已经尝试了Googling几个小时,但是却找不到任何可以显示基本地理空间信息的文档,例如使用Doctrine2获得两点之间的距离。就确定我选择的数据库而言,无法使用ORM对我来说意义重大。

有人可以给我展示一个基本的示例,让它说出使用“教义”显示半径10公里以内的所有点吗?

最佳答案

我在博客上写了一篇文章,解释了如何使用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/

正如您将看到的,将数据从数据库导入到对象需要进行一些转换:

  • 数据通过postgis转换为geojson(使用json_decode函数,php可读取json)
  • 数据被转换为Point对象

  • 从对象的世界到数据库:
  • 对象Point被转换为WKT。为什么使用WKT而不使用json?因为Postgis具有ST_GeogFromWKT函数,但还没有ST_GeogFromGeoJson函数。
  • 数据已插入数据库中。

  • 我还编写了一个自定义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());

    关于symfony - 如何使用PostGIS将Doctrine2与GeoSpatial查询配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11713508/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com