2012-11-05 67 views
2

我試圖在Linux系統上使用this snippet在我的管理界面中包含Google Maps小部件(目前在VMWare Player中的Bitnami django堆棧上本地運行)。如何添加EPSG 900913到geodjango spatialite數據庫?

的地圖渲染,而是指向特性(任何功能真的)在我的數據庫都沒有出現在地圖上,並試圖通過地圖界面註冊點的時候,我得到一個錯誤:

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

我從初始化spatialite/SQLite數據庫時,Google的空間參照系中不包含geodjango docs實現,該溶液應發出以下命令,以添加SRS:

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

然而,當我從我的p做到這一點roject目錄,我得到:

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插入到spatialite數據庫中。該解決方案的靈感來自http://trac.osgeo.org/openlayers/wiki/SphericalMercator上的sql語句(抱歉,我沒有足夠的信譽來發布更多鏈接),並使用raw 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 [email protected] +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也做其他事情?

最後,它可能是在我的應用程序編碼問題,我將在一個最小的測試工作,例如,並張貼...

回答

1

OK,我找到了答案,主要的問題,因爲下也表示編輯職位。

以供將來參考,這裏是一個方法,如何添加谷歌球面投影到spatialite數據庫(必須已在空間上啓用):

1)創建一個包含以下內容的文本文件:

BEGIN;

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 [email protected] +no_defs');

COMMIT;

2)除非一個名稱的文件像init_EPSG900913.sql目錄抱着你spatialite數據庫。

3)發出以下命令來對數據庫執行SQL語句:

spatialite some_database.sqlite < init_EPSG900913.sql

替代方法 - 從Django的腳本中或在 「蟒蛇manage.py殼」:

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 [email protected] +no_defs');" 
cursor.execute(sql) 
transaction.commit_unless_managed() 

使用這兩種方法中的任何一種,您的數據庫都將註冊Google Maps引用系統。

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的合適的子目錄/ ...