我正在使用Python 2.5,Django 1.2,MySQL和Apache开始一个GeoDjango项目.该项目将上传到Linux服务器,但开发将在Windows上进行.
问题是我无法通过安装GEOS,它是如何完成的?
在我的GeoDjango项目中,我想连接到传统的PostgreSQL/PostGIS数据库.它包含以下模式:
spatial_ref_sys我希望屏幕截图中显示的Django表进入django模式.我不想污染public架构.
我希望"数据"模型连接到data架构.我已经尝试从遗留表中生成模型,但是python manage.py inspectdb连接到public模式.
为了提供对不同模式的访问,我采用了本文的方法2,该方法将单个search_path值预先分配给特定的数据库用户:
-- user accessing django schema...
CREATE ROLE django_user LOGIN PASSWORD 'secret';
ALTER ROLE django_user SET search_path TO django, public;
-- user accessing data schema...
CREATE ROLE data_user LOGIN PASSWORD 'secret';
ALTER ROLE data_user SET search_path TO data, public;
Run Code Online (Sandbox Code Playgroud)
然后我按如下方式配置了数据库连接:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'multi_schema_db',
'USER': …Run Code Online (Sandbox Code Playgroud) 我在Ubuntu 14.04 LTS上运行Django 1.8和Python 3.4.就在最近,我的Django应用程序一直在报告GEOS不存在.安装了GEOS,并且libgeos_c.so应该是(/ usr/lib /).我的代码似乎很好.它是仍然可以工作的码头图像的来源.这似乎表明os /不兼容问题.任何帮助将非常感激.
完整的追溯是
Traceback (most recent call last):
File "<path/to/my/homedir>/pycharm-4.5.1/helpers/pydev/pydevd.py", line 2358, in <module>
globals = debugger.run(setup['file'], None, None, is_module)
File "<path/to/my/homedir>/pycharm-4.5.1/helpers/pydev/pydevd.py", line 1778, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "<path/to/my/homedir>/pycharm-4.5.1/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "<path/to/my/pycharm/project>/manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "<path/to/my/virtualenv>/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "<path/to/my/virtualenv>/lib/python3.4/site-packages/django/core/management/__init__.py", …Run Code Online (Sandbox Code Playgroud) 我一直在尝试设置我的Windows计算机,以便我可以使用PostGIS扩展的本地postgreSQL.有了这个安装,我希望能够在将它放入云之前在本地创建一个geodjango项目.我一直在使用SQLite DB在我的本地机器上使用Django一段时间,但由于下一个项目将部分基于基于坐标的数据,我想设置正确的环境.
导入说明:我已经安装了mini-conda以在单独的环境中运行.我工作的时候会激活这个环境"开发"
我试图在线跟踪大多数geodjango信息/教程,但无法使其工作.我做了什么(主要是遵循这个:https://docs.djangoproject.com/en/2.0/ref/contrib/gis/install/#windows):
毕竟我创建了一个新的django项目,在settings.py中我添加了一些部分:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.gis',
'nameOfMyApp',
]
Run Code Online (Sandbox Code Playgroud)
我在settings.py中也有这个:
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'geodjango',
'USER': '****',
'PASSWORD': '****',
'HOST': 'localhost',
}
}
# FOR GEODJANGO
POSTGIS_VERSION = (2, 4, 3)
Run Code Online (Sandbox Code Playgroud)
当我尝试在django中设置数据库时,我运行(在右侧文件夹中):
python manage.py makemigrations
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library (tried "gdal202", "gdal201", "gdal20", "gdal111", "gdal110", …Run Code Online (Sandbox Code Playgroud) 我有一些用户在我的Django应用程序中注册,我想简单地能够根据他们的邮政编码找出两个用户之间的距离,然后根据该列表对列表进行排序.我想这个功能没有内置到Django中.我正在寻找一些选项,偶然发现了geodjango,这似乎可能对我的需求有些过分.
我正在使用Google地图创建一个地理应用程序,我接收边界框作为2坐标:
我有一个PointField模型.
from django.contrib.gis.db import models
class Place(models.Model):
name = models.CharField(max_length=200)
address = models.CharField(max_length=200)
location = models.PointField()
Run Code Online (Sandbox Code Playgroud)
我如何执行查询以获取边界框内的所有位置?
我正在试图为GeoDjango安装Spatialite!
我已经在使用Homebrew了,它通常很简单方便,所以我最初尝试按照Homebrew的说明操作 GeoDjango.
但这不会安装任何数据库,即Spatialite.下一步是尝试安装Spatialite本身,但Django docs没有提供特定于Homebrew的指令.
我发现这个教程看起来很完美 - 一个Homebrew和virtualenv友好的Spatialite for GeoDjango安装.
但它不起作用......似乎我pysqlite与OS X附带的非空间启用的SQLite版本相关联,而不是我从Homebrew安装的Spatial-ised版本,我在Django尝试时遇到此错误连接到db:
"pysqlite库不支持C扩展加载.必须配置SQLite和pysqlite以允许加载扩展以使用SpatiaLite."
pysqlite的作者没有回应我在Github上寻求帮助的请求,我没有通过谷歌找到任何东西.
所以我回到绘图板并决定遵循GeoDjango文档中的"Mac OS X特定指令" ......通过安装KyngChaos二进制包中的各种地理库.
该文件说"在他们上面列出的顺序安装软件包",但我发现我不能安装UnixImageIO,而无需安装PROJ第一.下载Spatialite二进制文件(http://www.gaia-gis.it/spatialite-2.3.1/binaries.html)的文档中的链接已中断,因此我使用了来自KyngChaos的"Spatialite Tools v4.1".
继续下一步,我收到此错误:
$ spatialite geodjango.db "SELECT InitSpatialMetaData();"
SQLite header and source version mismatch
2013-10-17 12:57:35 c78be6d786c19073b3a6730dfe3fb1be54f5657a
2013-09-03 17:11:13 7dd4968f235d6e1ca9547cda9cf3bd570e1609ef
Run Code Online (Sandbox Code Playgroud)
在这一点上不确定是什么问题.
SO上有其他人已经走过了KyngChaos路线并且最终得到了相同的"两个SQLite和pysqlite必须配置为允许加载扩展"错误我从Homebrew路线得到了无论如何.
我发现这张票#17756用于添加pyspatialite对Django的支持 - pyspatialite应该是一种更简单的方式来处理pip install所有事情但不幸的是它也不起作用(请参阅对票底的评论).
我有点不愿意开始尝试从源头开始构建所有内容,因为我似乎可能会再次遇到同样的问题,但花费数小时谷歌搜索有关神秘的编译器错误,魔术标志和路径等的信息.
我准备放弃,只使用Postgres/PostGIS.
我有点困惑,我应该在我的GeoDjango PointField中设置我的SRID值,以便在地址通过谷歌地图api进行地理编码的情况下保持准确到坐标和通过django-postgis查询的距离?
我得到了混合意见阅读网络和堆栈流程的线程,我不确定该怎么做.正如您所看到的,我的应用程序使用geopy和google maps api来对地址进行地理编码.现在我的坐标字段没有SRID集,默认为4326,即(EPSG:4326).现在显然,这将地球视为地球仪,而不是平坦的地面.
根据以下问题的东西,如谷歌地图的答案使用(EPSG 3857),这显然有900913.的SRID https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-谷歌地图,OpenStreetMap的和小叶
那么这是否意味着我应该将我的SRID设置为900913?我所有的餐厅模型的坐标都使用地理编码器以下面看到的相同方法保存.我会这么认为.
现在,这是我得到揭去,下面的教程http://invisibleroads.com/tutorials/geodjango-googlemaps-build.html使用pointfield与他们的SRID设置为4326(默认)和他们的标志点完全出现在谷歌地图.
目前我的查询非常准确但仍然感觉有点偏.
感谢帮助,谢谢!
from geopy.geocoders import GoogleV3
from django.contrib.gis.geos import *
from django.contrib.gis.measure import D
geo = GoogleV3()
def home_page(request):
distance = 3680
address, coordinates = geo.geocode('Swanston Street, Melbourne Australia')
ref_location = Point(coordinates)
query = Restaurant.objects.filter(restaurant_location__distance_lte=(ref_location, D(m=distance))).distance(ref_location).order_by('distance')
return render(request, 'swings/home.html', {'restaurants': query})
Run Code Online (Sandbox Code Playgroud)
餐厅模特
class Restaurant(models.Model):
name = models.CharField(max_length=25, blank=False)
user = models.ForeignKey(User)
address = models.CharField(max_length=50, blank=False)
restaurant_location = models.PointField(null=False, blank=False)
objects = models.GeoManager()
def __str__(self):
return self.name
Run Code Online (Sandbox Code Playgroud) 我正在尝试让 GeoDjango 在 mac os 上运行,但遇到了 GDAL 问题。
我已经下载并安装了 GDAL(Gdal Complete Binary),也没有问题,也从自制软件安装。
不幸的是,当我用自制的 django 安装 gdal 时,找不到 gdal 并抛出 gdal did not find 错误,之后。我从KyngChaos GeoDjango Binary django find gdal安装,但现在抛出了这个问题;
OSError: dlopen(/Library/Frameworks/gdal.framework/gdal, 6): no suitable image found. Did find:
/Library/Frameworks/gdal.framework/gdal: mach-o, but wrong architecture
/Library/Frameworks/gdal.framework/gdal: mach-o, but wrong architecture
/Library/Frameworks/GDAL.framework/Versions/3.1/GDAL: mach-o, but wrong architecture
/Library/Frameworks/GDAL.framework/Versions/3.1/GDAL: mach-o, but wrong architecture
Run Code Online (Sandbox Code Playgroud)
我认为Kyngchaos构建与arm平台不兼容
任何帮助将非常感激。
Django版本:3.0也尝试了3.2
Gdal版本:3.2/3.1/2.4所有人都尝试了
Python版本:3.8
Postgresql版本:13
Postgis/Geos安装了
gdal-config --libs:
-L/opt/homebrew/Cellar/gdal/3.2.2_3/lib -lgdal
Run Code Online (Sandbox Code Playgroud) 我刚刚在我的开发机器上启动并运行GeoDjango.问题是我无法使距离查询正常工作.无论我使用什么SRID,距离结果都是完全关闭的.这是一个例子.
>>> from django.contrib.gis.measure import D
>>> from app.models import Place
>>> from django.contrib.gis.geos import Point
>>> qs = Place.objects.all()
>>> point = Point(-118, 34)
>>> qs.filter(coordinates__distance_lte=(point, D(m=1)))
[<Place: 7-Eleven>, <Place: Arthur Murray Dance Studio>, <Place: Costco>, <Place: AMC Century City 15>, <Place: 24 Hour Fitness>, <Place: Ralphs>, <Place: Houston's Restaurant>, <Place: CVS/pharmacy>, <Place: Shaky Alibi>, <Place: Sephora>, <Place: Trader Joe's>]
Run Code Online (Sandbox Code Playgroud)
问题是这些地方远离1米远point.
我试着玩弄它,但运气不好.这是另一个SRID的示例.
>>> qs = Place.objects.all().transform(3786)
>>> point = Point(-118, 34, srid=3786)
>>> qs.filter(coordinates__distance_lte=(point, D(m=1)))
[<Place: 7-Eleven>, …Run Code Online (Sandbox Code Playgroud) geodjango ×10
django ×9
python ×6
postgis ×5
postgresql ×3
geos ×2
google-maps ×2
gdal ×1
installation ×1
pysqlite ×1
spatialite ×1
sqlite ×1
ubuntu-14.04 ×1
windows ×1