这个想法是集成谷歌地图而不是 GeoDjango v1.11.5 的默认地图PointField()。
目前,在我的models.py 中
class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Teacher')
placename = models.CharField(blank=True,max_length=255)
latitude = models.FloatField(blank=True, null=True, verbose_name='Latitude')
longitude = models.FloatField(blank=True, null=True, verbose_name='Longitude')
location = models.PointField(blank = True, null=True, srid=4326)
objects = models.GeoManager()
def save(self, *args, **kwargs):
self.location = Point(self.longitude, self.latitude)
super(Teacher, self).save(*args, **kwargs) # Call the "real" save() method.
Run Code Online (Sandbox Code Playgroud)
但是,当我在手动添加 long 和 lat 后单击保存时,我得到:
TypeError at /admin/users/location/add/ 无法使用以下类型的值设置 Location SpatialProxy (POINT):
我正在开发一个 GeoDjango 应用程序,它使用教程中提供的 WorldBorder 模型。我还创建了自己的区域模型,该模型与 WorldBorder 相关联。所以一个 WorldBorder/Country 可以有多个 Region,其中也有边界(MultiPolygon 字段)。
我使用 DRF 为它制作了 API,但它太慢了,以 GeoJSON 格式加载所有 WorldBorder 和 Region 需要 16 秒。返回的 JSON 大小为 10MB。这合理吗?
我什至将序列化器更改为serpy,这比DRF GIS序列化器快得多,但仅提供 10% 的性能改进。
分析后发现,大部分时间都花在了 GIS 功能上,用于将数据库中的数据类型转换为坐标列表而不是 WKT。如果我使用 WKT,序列化速度要快得多(1.7s 与 11.7s 相比,WKT 仅适用于 WorldBorder MultiPolygon,其他一切仍在 GeoJson 中)
我还尝试使用低容差 (0.005) 的 ST_SimplifyVW 压缩 MultiPolygon 以保持准确性,从而将 JSON 大小降低到 1.7 MB。这使得总负载为 3.5s。当然,我仍然可以找到平衡精度和速度的最佳容差。
下面是分析数据(简化的 MultiPolygon 中查询的突然增加是由于 Django QS API 的错误使用来使用 ST_SimplifyVW)
编辑:我修复了数据库查询,因此查询调用在 75 次查询时保持不变,正如预期的那样,它不会显着提高性能。
编辑:我继续改进我的数据库查询。我现在将它减少到只有 8 个查询。正如预期的那样,它并没有提高那么多的性能。
下面是函数调用的分析。我强调了花费大部分时间的部分。这是使用vanilla DRF GIS实现。
下面是当我将 WKT 用于没有 ST_SimplifyVW …
我正在拦截边界框 ex 的查询参数。?bbox=160.6,-55.95,-170,-25.89在我的 GeoDjango 应用程序中过滤与 bbox 相交的条目的查询集。我想知道如何从 bbox 或 bbox 对象列表创建几何对象[160.6,-55.95,-170,-25.89]。
bbox = GEOSGeometry('BBOX [160.6,-55.95,-170,-25.89]')
Run Code Online (Sandbox Code Playgroud) 在我正在建设的网站中,我已经存储了带有城市外键的活动.像这样:
class Event(models.Model):
name = models.CharField(max_length=255)
...
ciudad = models.ForeignKey(City)
class City(models.Model):
name = models.CharField(max_length=500)
...
lat = models.FloatField()
lon = models.FloatField()
Run Code Online (Sandbox Code Playgroud)
我想在一些城市的某些公里查询事件.我实际做的是这样的:
# isInRange takes two cities and a distance in kms and calculates
# if the distance between the cities (by the fields lat and lon and
# one nice formula) is minor than the given distance.
results = []
for event in Event.objects.all():
if isInRange(city, event.city, kms):
results.append(event)
Run Code Online (Sandbox Code Playgroud)
我知道,效率非常低.我知道在GeoDjango中这样做是可行的,但这是我在整个项目中必须做的唯一"地理事物".我必须毫无理由地使用这种"复杂"的解决方案,或者有办法以更有效的方式做到这一点?
我正在尝试在GeoDjango中使用GeoAdmin.我有一个表planet_osm_point,我想在管理界面中看到它.我是django的初学者.
我有这个问题:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/api/planetosmpoint/
Django Version: 1.5.1
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.gis',
'api',
'portail')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Template error:
In template /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/change_list.html, error at line 91
'NoneType' object has no attribute 'encode'
81 : {% endif %}
82 : {% endblock %}
83 :
84 : <form id="changelist-form" action="" method="post"{% if cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %}>{% csrf_token %}
85 : {% if cl.formset …Run Code Online (Sandbox Code Playgroud) 是否可以通过PointField的lng,lat值查询Django模型?
<---example--->
Foo.objects.filter(bar=(-73, 34))
## bar == name of PointField in the django model.
## -73 == longitude
## 34 == latitude
Run Code Online (Sandbox Code Playgroud) 我正在开发一个 django 项目,尝试使用 GeoDjango。
在我的setting.py 中,我添加'django.contrib.gis',到已安装的应用程序,但出现此错误。
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\contrib\gis\admin\__init__.py", line 5, in <module>
from django.contrib.gis.admin.options import GeoModelAdmin, OSMGeoAdmin
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\contrib\gis\admin\options.py", line 2, in <module>
from django.contrib.gis.admin.widgets import OpenLayersWidget
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\contrib\gis\admin\widgets.py", line 3, in <module>
from django.contrib.gis.gdal import GDALException
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\contrib\gis\gdal\__init__.py", line 28, in <module>
from django.contrib.gis.gdal.datasource import DataSource
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\contrib\gis\gdal\datasource.py", line 39, in <module>
from django.contrib.gis.gdal.driver import Driver
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\contrib\gis\gdal\driver.py", line 5, in <module>
from django.contrib.gis.gdal.prototypes import ds as vcapi, raster as rcapi
File "C:\Users\lenovo\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\contrib\gis\gdal\prototypes\ds.py", line 9, in <module> …Run Code Online (Sandbox Code Playgroud) 我试图获取危险类型为“高”的所有建筑结构。我有以下查询:
>>> reference = FloodHazard.objects.filter(hazard='High')
>>> ids = reference.values('id')
>>> for id in ids:
... getgeom = FloodHazard.objects.get(id=id).geom
... getbldg = BuildingStructure.objects.filter(geom__intersects=getgeom).value_list('id')
Traceback (most recent call last):
File "<console>", line 3, in <module>
File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 151, in get
return self.get_queryset().get(*args, **kwargs)
File "C:\Python27\lib\site-packages\django\db\models\query.py", line 298, in get
clone = self.filter(*args, **kwargs)
File "C:\Python27\lib\site-packages\django\db\models\query.py", line 590, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\db\models\query.py", line 608, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "C:\Python27\lib\site-packages\django\db\models\sql\query.py", line 1198, in add_q
clause = self._add_q(where_part, used_aliases) …Run Code Online (Sandbox Code Playgroud) 我正在尝试MakeValid修复(验证)我的几何字段.
我可以通过获取和更新单行来使其工作:
from django.contrib.gis.db.models.functions import MakeValid
MyModel.objects.filter(id=<id>).update(polygon=MakeValid('polygon'))
Run Code Online (Sandbox Code Playgroud)
但是对于某些情况,我必须更新polygon已经在函数中实例化的单个模型对象(意味着我已经完成了.filter/ .get),这给了我以下错误:
// np is an object of MyModel which has a field 'polygon' which is `MultiPolygon` django model field
np.polygon = MakeValid(np.polygon)
// np.save()
TypeError: Cannot set MyModel SpatialProxy (MULTIPOLYGON) with value of type: <class 'django.contrib.gis.db.models.functions.MakeValid'>
Run Code Online (Sandbox Code Playgroud)
这里,MakeValid(np.polygon)不返回MultiPolygon对象.相反,它返回一个django.contrib.gis.db.models.functions.MakeValid包装器.
我可以从中获取Geometry对象MakeValid吗?
django ×9
geodjango ×9
python ×5
distance ×1
django-views ×1
geojson ×1
gis ×1
postgis ×1
python-3.x ×1