在 PostGIS 数据库中使用带有 spatial_template 的非空间模型

Posted

技术标签:

【中文标题】在 PostGIS 数据库中使用带有 spatial_template 的非空间模型【英文标题】:Using non-spatial models inside a PostGIS database with a spatial_template 【发布时间】:2013-10-08 00:20:11 【问题描述】:

我有一个非常简短的问题:我已经有一个使用 PostgreSQL 作为我的数据库后端的博客应用程序的项目。我即将开始试验 GeoDjango 和 PostGIS。为了创建一个使用 GeoDjango 的数据库,该数据库必须使用一个 spatial_template。我真的不想管理两个项目并做一些奇怪的事情来让这两个项目协同工作。如果可能的话,我想简单地安装 PostGIS,并在同一个项目中启动一个新应用程序。然后,我希望能够使用空间模板启动一个新数据库来运行我的空间数据。

我的问题是:我是否仍然可以将我的非空间博客模型(或任何其他模型,就此而言)与 PostGIS 数据库一起使用空间模板?

我不想通过所有 GeoDjango 依赖项的安装来发现它不起作用,这就是我首先问的原因。

期待您的反馈。

【问题讨论】:

【参考方案1】:

如果您有 PostgreSQL 9.1 或更高版本,您可以将 PostGIS 作为扩展添加到现有数据库:

CREATE EXTENSION postgis;

如果你发现它不是你想要的,那就删除它:

DROP EXTENSION postgis;

【讨论】:

看起来我没有完全理解 PostGIS 9.1 或更高版本中不需要模板。我刚刚创建了一个扩展,一切正常。我将不得不看看空间模型的所有额外功能是否会导致性能问题。【参考方案2】:

是的,它可以做到。我创建了两个模型,一个带有点,另一个带有非空间相关数据。使用 template_postgis。这是一些代码:

DATABASES = 
    'default': 
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        # 'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'pccs',
        'USER': 'xxxxx',
        'PASSWORD': 'xxxxx',
        'HOST': 'localhost', 
        'PORT': '5432', # Set to empty string for default.

from django.contrib.gis.db import models

class Station(models.Model):
    station_num = models.IntegerField("Station Number", max_length=4, primary_key=True)
    station_name = models.CharField("Station Name", max_length=50)
    station_type = models.CharField("Station Type", max_length=20, choices=TYPE_CHOICES)
    geom = models.PointField(srid=4326)
    objects = models.GeoManager()

def __unicode__(self):
    return unicode(self.station_name)

class Meta:
    verbose_name_plural = 'Monitoring Stations'


class Nutrient(models.Model):
    station_num = models.ForeignKey(Station)
    sample_date = models.DateField(editable=True)
    #sample_depth = models.IntegerField("Sample Depth", max_length=4, default="1")
    a = models.DecimalField("Temperature", max_digits=10, decimal_places=4)
    ...
    o = models.DecimalField("ph", max_digits=10, decimal_places=4, blank=True, null=True)

def __unicode__(self):
    return unicode(self.station_num_id)


class Meta:
    verbose_name_plural = 'Water Sample Data'

希望这就是你要找的东西

【讨论】:

以上是关于在 PostGIS 数据库中使用带有 spatial_template 的非空间模型的主要内容,如果未能解决你的问题,请参考以下文章

错误:匹配 postgis 自定义模式时,函数 postgis_lib_version() 不存在

如何在 Spark SQL 中启用 Postgis 查询

带有 postgis 的 geodjango 不起作用

使用 liquibase 和 docker postgis/postgis 的错误编码

使用 PostGIS 查找给定点的 n 个最近邻?

PostGIS - 路线匹配解决方案