首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >GeoDjango + PostGIS:纯几何体SRID

GeoDjango + PostGIS:纯几何体SRID
EN

Stack Overflow用户
提问于 2018-06-11 01:08:20
回答 1查看 623关注 0票数 1

我正在考虑使用django (2.0.6)和Postgres/postGIS作为后端(10/2.4?)。

然而,我打算使用的模型几何图形将不会存储在椭球体(无论是地球火星等)或任何其他类型的SRID上。而是在3D笛卡尔坐标中100%纯几何,其中1个单位=1米。

如何声明模型字段并确保它们都是纯几何:

数据库级别的

  • 应用程序级别的

这样行得通吗?

代码语言:javascript
复制
geometry = models.MultiPolygonField(_('Geometry'), spatial_index=True, dim=3)

或者设置SRID更好?:

代码语言:javascript
复制
geometry = models.MultiPolygonField(_('Geometry'), spatial_index=True, dim=3, srid=0)

非常感谢

EN

回答 1

Stack Overflow用户

发布于 2018-06-13 03:31:29

对于1m笛卡尔网格,可以使用SRID 3857

models.py

代码语言:javascript
复制
class Place(models.Model):
    geom = models.PointField(srid=3857, dim=3)

    def __str__(self):
        return str(self.geom.coords)

但是,GeoDjango不支持开箱即用的三维距离计算。例如:

代码语言:javascript
复制
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import Distance

from myapp.models import Place

p = Point(100, 100, 0)

Place.objects.create(geom=p)
Place.objects.create(geom=Point(150, 100, 0))
Place.objects.create(geom=Point(100, 100, 22))
Place.objects.create(geom=Point(100, 100, 500))
Place.objects.create(geom=Point(150, 150, 0))
Place.objects.create(geom=Point(250, 250, 0))

for o in Place.objects.filter(geom__distance_lte=(p, Distance(m=100))):
    print(o.geom.coords, p.distance(o.geom))

输出:

代码语言:javascript
复制
(100.0, 100.0, 0.0) 0.0
(150.0, 100.0, 0.0) 50.0
(100.0, 100.0, 22.0) 0.0
(100.0, 100.0, 500.0) 0.0
(150.0, 150.0, 0.0) 70.71067811865476

在纯PostGIS中,比较ST_DistanceST_3DDistance

代码语言:javascript
复制
SELECT *
FROM (
       SELECT
         "myapp_place"."id",
         ST_Distance("myapp_place"."geom",
                     ST_GeomFromEWKT('SRID=3857;POINT(100 100 0)')) d,
         ST_AsEWKT("myapp_place"."geom")

       FROM "myapp_place"
     ) t
WHERE d <= 100.0

代码语言:javascript
复制
SELECT *
FROM (
       SELECT
         "myapp_place"."id",
         ST_3DDistance("myapp_place"."geom",
                     ST_GeomFromEWKT('SRID=3857;POINT(100 100 0)')) d,
         ST_AsEWKT("myapp_place"."geom")

       FROM "myapp_place"
     ) t
WHERE d <= 100.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50786126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档