GEODJANGO中不存在几何图形

3 投票
5 回答
2231 浏览
提问于 2025-04-18 05:31

我已经安装了Geodjango的所有依赖!现在我在跟着它的教程 https://docs.djangoproject.com/en/1.2/ref/contrib/gis/tutorial/ -- 问题是:运行命令 python manage.py syncdb 时出现错误,错误信息是 mpoly geometry(multipolygon 4326) not null that geometry does not exist

from django.contrib.gis.db import models

class WorldBorders(models.Model):
    # Regular Django fields corresponding to the attributes in the
    # world borders shapefile.
    name = models.CharField(max_length=50)
    area = models.IntegerField()
    pop2005 = models.IntegerField('Population 2005')
    fips = models.CharField('FIPS Code', max_length=2)
    iso2 = models.CharField('2 Digit ISO', max_length=2)
    iso3 = models.CharField('3 Digit ISO', max_length=3)
    un = models.IntegerField('United Nations Code')
    region = models.IntegerField('Region Code')
    subregion = models.IntegerField('Sub-Region Code')
    lon = models.FloatField()
    lat = models.FloatField()

    # GeoDjango-specific: a geometry field (MultiPolygonField), and
    # overriding the default manager with a GeoManager instance.
    mpoly = models.MultiPolygonField() //ERROR HERE

这个错误该怎么解决呢?

更新:

运行 python manage.py sqlall world 后得到以下输出:

BEGIN;
CREATE TABLE "world_worldborders" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(50) NOT NULL,
    "area" integer NOT NULL,
    "pop2005" integer NOT NULL,
    "fips" varchar(2) NOT NULL,
    "iso2" varchar(2) NOT NULL,
    "iso3" varchar(3) NOT NULL,
    "un" integer NOT NULL,
    "region" integer NOT NULL,
    "subregion" integer NOT NULL,
    "lon" double precision NOT NULL,
    "lat" double precision NOT NULL,
    "mpoly" geometry(MULTIPOLYGON,4326) NOT NULL
)
;
CREATE INDEX "world_worldborders_mpoly_id" ON "world_worldborders" USING GIST ( "mpoly" );

COMMIT;

而运行 python manage.py syncdb 时出现了:程序错误:几何类型不存在

root@cvp-linux:~/geodjango# python manage.py syncdb 正在同步... 创建表格 ... 创建表 django_admin_log 创建表 auth_permission 创建表 auth_group_permissions 创建表 auth_group 创建表 auth_user_groups 创建表 auth_user_user_permissions 创建表 auth_user 创建表 django_content_type 创建表 django_session 创建表 world_worldborders 追踪(最近的调用最后): 文件 "manage.py",第 10 行,在 <module> execute_from_command_line(sys.argv) 文件 "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py",第 399 行,在 execute_from_command_line utility.execute() 文件 "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py",第 392 行,在 execute self.fetch_command(subcommand).run_from_argv(self.argv) 文件 "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py",第 242 行,在 run_from_argv self.execute(*args, **options.__dict__) 文件 "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py",第 285 行,在 execute output = self.handle(*args, **options) 文件 "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py",第 415 行,在 handle return self.handle_noargs(**options) 文件 "/usr/local/lib/python2.7/dist-packages/south/management/commands/syncdb.py",第 92 行,在 handle_noargs syncdb.Command().execute(**options) 文件 "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py",第 285 行,在 execute output = self.handle(*args, **options) 文件 "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py",第 415 行,在 handle return self.handle_noargs(**options) 文件 "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/syncdb.py",第 107 行,在 handle_noargs cursor.execute(statement) 文件 "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py",第 69 行,在 execute return super(CursorDebugWrapper, self).execute(sql, params) 文件 "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py",第 53 行,在 execute return self.cursor.execute(sql, params) 文件 "/usr/local/lib/python2.7/dist-packages/django/db/utils.py",第 99 行,在 __exit__ six.reraise(dj_exc_type, dj_exc_value, traceback) 文件 "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py",第 51 行,在 execute return self.cursor.execute(sql) django.db.utils.ProgrammingError: 类型 "geometry" 不存在 第 14 行: "mpoly" geometry(MULTIPOLYGON,4326) NOT NULL

5 个回答

0

假设你在使用postgis,并且你的表或模型是在公共模式下:

CREATE EXTENSION postgis;

如果你为你的表或模型创建了另一个模式,那么在settings.py文件中需要添加一些选项:

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'OPTIONS': {
            'options': '-c search_path=YOUR_SCHEMA_NAME,public'
        },
        'NAME': 'DATABASE_NAME',
        'USER': 'DATABASE_USER',
        'PASSWORD': 'DATABASE_PASSWORD',
        'HOST': 'DATABASE_HOST',
        'PORT': 'DATABASE_PORT',
    }
}
0

试着在你的 models.py 文件中,mpoly 后面加上这行代码:

objects = models.GeoManager()

0

在我的情况下,问题是这些命令:

-- Enable PostGIS (includes raster)
CREATE EXTENSION postgis;
-- Enable Topology
CREATE EXTENSION postgis_topology;
-- fuzzy matching needed for Tiger
CREATE EXTENSION fuzzystrmatch;
-- Enable US Tiger Geocoder
CREATE EXTENSION postgis_tiger_geocoder;

需要在特定的数据库环境中运行,所以你需要先连接到 your_db

\connect your_db

然后再运行上面的命令!

0

这是修复好的问题单,

https://code.djangoproject.com/ticket/21547

更新了 GeoDjango 教程,包含了 PostGIS 2 的输出内容

5

这里有几个需要检查的地方:

  • 你需要运行 CREATE EXTENSION postgis;
  • 在你的项目的 settings.py 文件中设置 GEOS_LIBRARY_PATH

第二点让我有点困扰,不过最后是第一点解决了我的问题。我是在 Cygwin 64 位环境下运行的,所以需要做一些额外的工作来让它正常工作。如果你不是在 Cygwin 环境下,可能你要找的文件是 libgeos_c.so;而我需要指向的是 cyggeos_c-1.dll(因为我还是在 Windows 上,所以我需要找的是 .dll 后缀的文件)。

我一直以为我已经运行过 CREATE EXTENSION 命令了,但可能我没有在 Cygwin 环境下运行。或者我尝试过,但忘记了我的配置有点复杂,导致 postgres 服务器并没有在 localhost 上运行,所以我一直在避免使用 psql。这就是我自己的小麻烦。

撰写回答