我在设置GeoDjango安装时仍然遇到问题,该安装使用Spatialite作为Windows机器的后端.
我使用了GeoDjango安装程序并从http://www.gaia-gis.it/spatialite/binaries.html下载了预编译库,并将它们转储到我的geodjango/bin目录中.
我将我的pysqlite2安装升级到最新版本,以便可以加载扩展并SPATIALITE_LIBRARY_PATH在我的设置文件中指定.
当我运行时,manage syncdb我得到以下输出
C:\stuff>manage.py syncdb
SpatiaLite version ..: 2.3.1 Supported Extensions:
- 'VirtualShape' [direct Shapefile access]
- 'VirtualText' [direct CSV/TXT access]
- 'VirtualNetwork [Dijkstra shortest path]
- 'RTree' [Spatial Index - R*Tree]
- 'MbrCache' [Spatial Index - MBR cache]
- 'VirtualFDO' [FDO-OGR interoperability]
- 'SpatiaLite' [Spatial SQL - OGC]
PROJ.4 Rel. 4.6.1, 21 August 2008
GEOS version 3.0.2-CAPI-1.4.2
但是,在为表设置索引时,我收到以下消息:
... Installing custom SQL for core.LocationHint model updateTableTriggers: "no such module: rtree" …
我有一个GeoDjango模型对象,我不想序列化为json.我在我看来这样做:
lat = float(request.GET.get('lat'))
lng = float(request.GET.get('lng'))
a = Authority.objects.get(area__contains=Point(lng, lat))
if a:
return HttpResponse(simplejson.dumps({'name': a.name,
'area': a.area.geojson,
'id': a.id}),
mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)
问题是,simplejson认为a.area.geojson作为一个简单的字符串,即使它是美丽的预先生成的JSON.这可以通过eval()"区域字符串" 在客户端中轻松修复,但我想做到这一点.我可以告诉simplejson一个特定的字符串已经是json并且应该按原样使用(而不是作为简单的字符串返回)?或者还有另一种解决方法吗?
更新 只是为了澄清,这是当前返回的json:
{
"id": 95,
"name": "Roskilde",
"area": "{ \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 12.078701, 55.649927 ], ... ] ] ] }"
}
Run Code Online (Sandbox Code Playgroud)
挑战是让"area"成为json字典而不是简单的字符串.
我已经按照geodjango安装(Windows XP)和教程完美我正在运行django 1.2当我进入syncdb并运行时,我收到以下内容.
raise ImproperlyConfigured(error_msg)
django.core.exceptions.ImproperlyConfigured:'django.db.backends.postgis' isn
an available database backend.
Try using django.db.backends.XXX, where XXX is one of:
'dummy', 'mysql', 'oracle', 'postgresql', 'postgresql_psycopg2', 'sqlite3
Error was: No module named postgis.base
Run Code Online (Sandbox Code Playgroud)
我尝试更改为'django.db.backends.postgresql_psycopg2'作为替代方案然后我收到此响应:
AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'
Run Code Online (Sandbox Code Playgroud)
当我尝试posgresql时:
**raise ImproperlyConfigured("Error loading psycopg module: %s" % e)
django.core.exceptions.ImproperlyConfigured: Error loading psycopg module: No mo
dule named psycopg**
Run Code Online (Sandbox Code Playgroud)
它不应该是我成功下载和安装的postgis吗?为什么不工作?我是新人,我正在努力学习,所以任何帮助将不胜感激.
我今天来了一个关于Django的设计/架构问题.
我在几个网站上工作(托管在同一台服务器上),这些网站个别需要地理数据(州,城镇等).每个项目都包含应用程序,每个应用程序可能包含带有ForeignKey城镇或州的字段的模型.
为了不重复自己,我不打算建立一个数据库来存储这些城镇和州,并通过Django项目使用它.
Django提供了一种直接的方式,可以在同一个项目中使用多个数据库,在settings.py文件中声明它并编写路由器类来保存读写内容.但就这样,不可能使用如下select_related声明:
job = get_object_or_404(Jobs.objects.select_related('state__town'), user=user)
Run Code Online (Sandbox Code Playgroud)
这种行为对我来说很自然(不可能从头开始在数据库之间进行连接)......
我的问题:
一个快速而肮脏的解决方案是在每个项目数据库中导入所有地理数据(城镇,州......),但它根本不是DRY :(:
python manage.py loaddata geo.json
Run Code Online (Sandbox Code Playgroud)
另一种解决方案可能是建立一个独立的"地理"应用程序,它可以"服务"(我不知道如何)将数据传输到其他项目......实际上,我尝试过GeoDjango,但它看起来真的很复杂,而且它可能不会回答我的问题!
非常感谢您的答案!
我打算在我的python和geodjango Web服务中添加日志记录机制.log4j在python/geodjango中看起来像一个类似的日志记录机制吗?
我正在寻找log4j的dailyrollingfileappender等价物.然后自动删除所有1个月的日志文件.
任何指导表示赞赏.
更新1 我正在考虑以下格式.
datetime(ms)|log level|current thread name|client ip address|logged username|source file|source file line number|log message
Run Code Online (Sandbox Code Playgroud) 我有一个在Heroku上托管的Django项目,它有一个从cirlabs/heroku-buildpack-geodjango分叉的buildpack.有时当我推到Heroku时,它会响应
Counting objects: 16, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (9/9), 790 bytes, done.
Total 9 (delta 7), reused 0 (delta 0)
-----> Heroku receiving push
-----> Fetching custom buildpack... failed
! Heroku push rejected, error fetching custom buildpack
To git@heroku.com:taplister-staging.git
! [remote rejected] dev -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:heroku-app.git'
Run Code Online (Sandbox Code Playgroud)
我想知道这可能是buildpack本身的一个错误,或者它是否与Heroku如何与github交互?
哦,我的heroku config也是buildpack URL
BUILDPACK_URL: https://github.com/taplister/heroku-buildpack-geodjango …Run Code Online (Sandbox Code Playgroud) 我正在为我刚开始的新GeoDjango项目编写测试.通常我使用Factory Boy和Faker来创建用于测试的模型实例.但是我不清楚如何模拟GeoDjango PointField字段.当查看Spacialite中的记录时,它显示为二进制blob.
我对GIS的东西很陌生,对于如何在Django中为PointFields创建工厂有点困惑.
# models.py
from django.contrib.gis.db import models
class Place(models.Model):
name = models.CharField(max_length=255)
location = models.PointField(blank=True, null=True)
objects = models.GeoManager()
def __str__(self):
return "%s" % self.name
Run Code Online (Sandbox Code Playgroud)
# factories.py
import factory
from faker import Factory as FakerFactory
from . import models
faker = FakerFactory.create()
class PlaceFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.Place
name = factory.LazyAttribute(lambda x: faker.name())
#location = What do I do?
Run Code Online (Sandbox Code Playgroud) PointField如果我具有从Google Maps API进行地理编码的经度和纬度,则保存的语法是什么?
GeoDjango文档缺少此类信息(感觉像他们仅为专业人士写了足够的细节才能有效地使用它),而我所发现的只是一个没有被接受的答案:如何分配给Django PointField模型属性?
对于上下文,这是我想要做的:
class Point(models.Model):
geography = models.PointField(geography=True)
geometry= models.PointField(srid=3348) #Statistics Canada Lambert projection
Run Code Online (Sandbox Code Playgroud)
我的用户发出的大多数查询的类型都是“向我显示距离该点大约20公里的所有点,并从最远到最远对它们进行排序”。即使数据在加拿大各地都有点,用户对任何给定查询都只对小范围内的点感兴趣,因此geometryPointField可以满足99%的使用率。
如果需要以米为单位的距离测量(而不是简单地从最近到最远排序),则将使用geographyPointField。
我正在尝试设置Docker和geodjagno。当docker-compose up我有以下错误:
django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library (tried "gdal", "GDAL", "gdal2.2.0", "gdal2.1.0", "gdal2.0.0", "gdal1.11.0", "gdal1.10.0", "gdal1.9.0"). Is GDAL installed? If it is, try setting GDAL_LIBRARY_PATH in your settings.
Run Code Online (Sandbox Code Playgroud)
GDAL是可以在此图像中找到的库 wooyek/geodjango
Docker文件
FROM wooyek/geodjango
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
Run Code Online (Sandbox Code Playgroud)
码头工人组成
services:
web:
build: .
container_name: web
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
db:
image: mdillon/postgis …Run Code Online (Sandbox Code Playgroud) 我想过滤特定范围内的项目的查询集.这就是我的模型
class modelEmployee(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
location = models.PointField(srid=4326,max_length=40, blank=True,null=True)
objects = GeoManager()
Run Code Online (Sandbox Code Playgroud)
现在这就是我运行过滤器命令的方式.返回90英里特定范围内的物品.
qset = modelEmployee.objects.filter(location__distance_lte=(someLocation, D(mi=90)))
Run Code Online (Sandbox Code Playgroud)
结果返回一个物品,其距离实际为223.732英里,它不应该返回.
这些是两个项目的位置
location A - lat: 47.628641 and long: -117.402997
location B - lat: 47.618337 and long: -122.205341
Run Code Online (Sandbox Code Playgroud)
两者的距离实际为223.732英里.我必须过滤它错了.关于我可能出错的地方的任何建议?
geodjango ×10
django ×7
python ×4
gis ×2
buildpack ×1
docker ×1
factory-boy ×1
geospatial ×1
heroku ×1
json ×1
logging ×1
postgresql ×1
simplejson ×1
spatialite ×1
sqlite ×1