2

我试图在我的管理界面中包含一个谷歌地图小部件,在 Linux 系统上使用这个片段(目前在 VMWare Player 的 Bitnami django 堆栈上本地运行)。

地图呈现,但我的数据库中的点特征(实际上是任何特征)没有显示在地图上,当尝试通过地图界面注册点时,我收到一个错误:

An error occurred when transforming the geometry to the SRID of the geometry form field.

我从geodjango 文档中意识到,在初始化 spatialite/sqlite 数据库时不包括 Google 的空间参考系统,解决方案应该是发出以下命令,以添加 SRS:

$ python manage shell
>>> from django.contrib.gis.utils import add_srs_entry
>>> add_srs_entry(900913)

但是,当我从项目目录执行此操作时,我得到:

ERROR 6: EPSG PCS/GCS code 900913 not found in EPSG support files.  Is this a valid
EPSG coordinate system?

我已确认安装了 GDAL、GEOS 和 PROJ4,并且我已将环境变量 GDAL_DATA 和 PROJ_LIB 添加到我的 .profile 中。我检查了/usr/local/share/gdal/gcs.csv文件,该文件似乎没有 900913 的条目(我搜索了其他版本的 gcs.csv,但似乎没有一个包含 900913)。我认为这是导致错误的原因。但是,同一目录中的cubewerx_extra.wkt确实有一个 900913 的 WKT 条目。

我的问题是:如何让add_srs_entry找到正确的 SRS 表示以便将其添加到我的数据库中?或者是否有解决方法,例如以某种方式转换 WKT 表示并将其手动插入 gcs.csv?

我很感激任何帮助!

编辑: 我找到了一种将 EPSG 900913 手动插入到空间数据库中的方法。该解决方案的灵感来自 http://trac.osgeo.org/openlayers/wiki/SphericalMercator 上的 sql 语句(对不起,我没有足够的声誉来发布更多链接)并使用原始 sql 发布到数据库后端(如 https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly 的文档中所述):

from django.db import connection, transaction
cursor = connection.cursor()
sql = "INSERT into spatial_ref_sys (srid, auth_name, auth_srid, ref_sys_name, proj4text) values (900913 ,'EPSG',900913,'Google Maps Global Mercator','+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs');"
cursor.execute(sql)
transaction.commit_unless_managed()

我已经确认该条目现在位于 spatial_ref_sys 表中。但是尝试在管理界面中添加点时,我仍然遇到同样的错误。可以将点添加到地图中,但是在尝试保存该功能时,出现错误:

An error occurred when transforming the geometry to the SRID of the geometry form field.

上面的sql语句正确吗?是否足够,或者 add_srs_entry 是否也做其他事情?

最后,这可能是我的应用程序中的一个编码问题,我将处理一个最小的测试示例并将其发布......

4

2 回答 2

1

好的,我找到了主要问题的答案,如编辑帖子下所示。

以供将来参考,这是一种如何将 Google 球面投影添加到空间数据库(必须已在空间上启用)的方法:

1)创建一个包含以下内容的文本文件:

开始;

插入到 spatial_ref_sys (srid, auth_name, auth_srid, ref_sys_name, proj4text) 值 (900913,'EPSG',900913,'Google Maps Global Mercator','+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0 =0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs');

犯罪;

2) 将名为init_EPSG900913.sql的文件保存在包含您的空间数据库的目录中。

3) 发出以下命令在数据库上执行 SQL 语句:

spaceite some_database.sqlite < init_EPSG900913.sql

替代方法- 从 django-script 内部或“python manage.py shell”中:

from django.db import connection, transaction
cursor = connection.cursor()
sql = "INSERT into spatial_ref_sys (srid, auth_name, auth_srid, ref_sys_name, proj4text) values (900913 ,'EPSG',900913,'Google Maps Global Mercator','+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs');"
cursor.execute(sql)
transaction.commit_unless_managed()

使用这两种方法中的任何一种,您的数据库都将注册 Google Maps 参考系统。

于 2012-11-05T20:20:39.093 回答
1

事实证明,缺少 EPSG 定义只是问题的一部分。另一部分与应用程序在 bitnami ubuntu django 堆栈上运行的事实有关。

遵循 bitnami ubuntu django 堆栈上 geodjango 文档中的安装指南时,所有额外的 python 包和空间库都安装在系统文件夹 /user/local/..something.. 中,而不是安装在自包含的 bitnami 环境中。

为了将来参考,请确保在安装其他 python 包之前发出以下语句:

$ sudo su
$ /opt/bitnami/use_djangostack

然后软件包将安装在 bitnami 环境中。

此外,在使用 ./configure 命令配置不同空间库的构建时,必须添加额外选项以将共享文件放置在 bitnami 环境中。我通常使用类似的东西:

$ ./configure --prefix=/opt/bitnami/common

可能必须按照 geodjango 文档中的说明传递其他参数 - 但这些参数中指定的路径必须更改为指向 /opt/bitnami/... 的正确子目录

于 2012-11-06T23:03:40.597 回答