GEODJANGO 中不存在几何

问题描述 投票:0回答:5

我已经安装了Geodjango的所有依赖!现在我正在遵循它的教程 https://docs.djangoproject.com/en/1.2/ref/contrib/gis/tutorial/ -- 问题:命令 python manage.pysyncdb 在

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
生成:
Program Error Geometry Doesn't exist
:

root@cvp-linux:~/geodjango# python manage.py syncdb
Syncing...
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table world_worldborders
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 415, in handle
    return self.handle_noargs(**options)
  File "/usr/local/lib/python2.7/dist-packages/south/management/commands/syncdb.py", line 92, in handle_noargs
    syncdb.Command().execute(**options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 415, in handle
    return self.handle_noargs(**options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/syncdb.py", line 107, in handle_noargs
    cursor.execute(statement)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py", line 69, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 99, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py", line 51, in execute
    return self.cursor.execute(sql)
django.db.utils.ProgrammingError: type "geometry" does not exist
LINE 14:     "mpoly" geometry(MULTIPOLYGON,4326) NOT NULL

python django geodjango
5个回答
5
投票

需要检查的几件事:

  • 你已经跑了
    CREATE EXTENSION postgis;
  • GEOS_LIBRARY_PATH 在项目的 settings.py 文件中设置

第二点给我带来了一些麻烦,尽管第一点最终解决了问题。我在 Cygwin 64 位上运行它,因此需要做一些额外的工作才能使其工作。如果您没有在 Cygwin 环境中运行,那么您正在寻找的文件很可能是 libgeos_c.so;我需要将其指向 cyggeos_c-1.dll(仍在 Windows 上运行,因此我需要找到 .dll 扩展名)。

我确信我已经运行了 CREATE EXTENSION 命令,但我可能没有在 Cygwin 环境中运行它。或者我尝试过,但没有记住我有一个配置的噩梦,因为 postgres 服务器没有在本地主机上运行,所以我避免了 psql。这就是我自己品牌的厚度。


0
投票

这是固定票,

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

使用 PostGIS 2 输出更新了 GeoDjango 教程


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
投票

尝试添加

objects = models.GeoManager()

在 models.py 中的 mpoly 之后


0
投票

假设您将 postgis 与公共模式中的表/模型一起使用:

CREATE EXTENSION postgis;

假设您为表/模型创建了另一个架构,em 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',
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.