如何在GeoDjango中使用子查询获得相交的几何?

时间:2017-08-10 09:51:44

标签: python django postgis geodjango

我正在尝试从一个表中获取所有记录,这些表的几何与来自同一个表的缓冲几何相交,我用子查询得到它。

我的工作原理SQL语句是:

SELECT id FROM table 
WHERE ST_INTERSECTS(geom, (
    SELECT ST_BUFFER(geom, 10) FROM table WHERE id = 1)
);

如何使用GeoDjango实现这一目标?

修改

使用以下内容:

records = table.objects.filter(
    geom__intersects = table.objects.filter(pk=1).values('geom')
)

但我仍然错过了缓冲区 有什么建议吗?

2 个答案:

答案 0 :(得分:1)

经过一番研究后,我通过以下方式解决了这个问题:

# First get the geometry i tried to get in the subquery
tempgeom = table.objects.get(pk=1)
# Apply the buffer
tempgeom = tempgeom.geom.buffer(10)
# Use the buffered geometry to get the records
records = table.objects.filter(geom__intersects = tempgeom)

我认为有更好的方法,但现在,它有效。

答案 1 :(得分:0)

你的解决方案是正确的@Chris。

唯一的补充可能是添加了Subquery的Django 1.11版。

基本上,您可以将PostgreSQL查询转换为以下内容:

 var http = require('http');       
 var express = require('express'); // Web Framework
 var app = express();
 var sql = require('mssql'); // MS Sql Server client

 var sqlConfig = {
    server: '(localdb)\MSSQLLocalDB',
    database: 'NodejsApp',
    user: 'ra',
    password: 'root@123',
    port: 1433
}

// Start server and listen on http://localhost:8081/
var server = app.listen(8081, function () {
    var host = server.address().address
    var port = server.address().port

    console.log("app listening at http://%s:%s", host, port)
});

function makeconn() {
    var conn = new sql.Connection(sqlConfig);
    var req = new sql.Request(conn);

    conn.connect(function (err) {
        if (err) {
            console.log(err);
            return;
        }
        else {
            console.log('success');
        }
    });
}
makeconn();

并避免中间步骤。