我正在使用GeoDjango和PostGIS,并尝试使用多边形从数据库中获取记录.
如果我定义一个大于地球面积一半的多边形,则假定我的多边形的"内部"是我打算作为"外部"的较小区域,并仅返回其外部的结果.
我可以使用这个较小的错误区域来排除结果.Polygon.area似乎知道我打算做什么,所以我可以用它来确定何时使我的搜索包含或排除.我觉得这个问题可能很常见,有没有更好的解决方法?
更新:如果180度经度在我的多边形内部,则根本不起作用.看来GEOS这次应该受到指责.这张图片显示了我认为的原因.绿色是我定义的多边形,红色是它似乎解释它的方式.
同样,这似乎是一个经常出现的问题,而且像GEOS这样的图书馆需要处理这个问题.有办法吗?
我正在使用geodjango并在我的数据库中有一个点集合.要获取某个区域内的点的查询集,我使用:
queryset = Spot.objects.filter(point__distance_lte=(origin, distance_m))
Run Code Online (Sandbox Code Playgroud)
我的问题是我怎样才能从我通过的点返回一个点(距离最短的点)?
编辑
我应该提一下,我正在传递坐标并希望Point用它们创建一个对象.然后将该点作为原点传递并对其进行过滤.例如,我尝试过:
from spots.models import *
from django.contrib.gis.geos import *
origin = Point(28.011030, -26.029430)
distance_m = 1000
queryset = Spot.objects.filter(point__distance_lte=(origin, distance_m))
for q in queryset:
print q.distance
Run Code Online (Sandbox Code Playgroud)
这段代码给了我这个错误:
Traceback (most recent call last):
File "<console>", line 2, in <module>
AttributeError: 'Spot' object has no attribute 'distance'
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我执行以下操作:
origin = Spot.objects.get(name='Montecasino').point
distance_m = 1000
for city in Spot.objects.distance(origin):
print(city.name, city.distance)
(u'Design Quarter Parking', Distance(m=677.347841801))
(u'Montecasino', Distance(m=0.0))
(u'Fourways', Distance(m=1080.67723755))
Run Code Online (Sandbox Code Playgroud) 我用的时候
from django.contrib.gis.db import models
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
from django.contrib.gis.db import models
File "C:\Python27\lib\site-packages\django\contrib\gis\db\models\__init__.py"
, line 2, in <module>
from django.db.models import *
File "C:\Python27\lib\site-packages\django\db\__init__.py", line 11, in <module>
if DEFAULT_DB_ALIAS not in settings.DATABASES:
File "C:\Python27\lib\site-packages\django\utils\functional.py", line 184,
in inner
self._setup()
File "C:\Python27\lib\site-packages\django\conf\__init__.py", line 40,
in _setup
raise ImportError("Settings cannot be imported, because environment
variable %s
is undefined." % ENVIRONMENT_VARIABLE)
ImportError: Settings cannot be imported, because environment variable
DJANGO_SETTINGS_MODULE is undefined. …Run Code Online (Sandbox Code Playgroud) 我正在 django 中开发一个 web 应用程序,我想构建一个功能,在这个功能中,一个人可以在文本框中输入一个位置名称,相应的位置显示在下一页谷歌地图的中心。
请让我知道可以在 Django 中完成此操作的详细方法
先感谢您!
我无法在heroku上运行一个简单的GeoDjango应用程序.我为我的数据库创建了postgis扩展,但是我无法在不收到以下错误的情况下运行syncdb:
from django.contrib.gis.geometry.backend import Geometry
File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/gis/geometry/backend/__init__.py", line 14, in <module>
'"%s".' % geom_backend)
django.core.exceptions.ImproperlyConfigured: Could not import user-defined GEOMETRY_BACKEND "geos".
Run Code Online (Sandbox Code Playgroud)
我有什么想法我做错了吗?也有人知道在heroku上运行一个简单的geodjango项目的教程吗?谢谢你的帮助
我想知道如何在 admin 中更改默认的 PointField 可视化(Openstreetmap),以便我可以输入简单的纬度/经度而不是在地图上选择一个点?
我看着这个点域的纬度/经度小部件?但无法在 Django 1.6b4 中以任何方式工作
谢谢
我在具有 GeoDjango 的默认 SRID、WGS84 的 Postgis 数据库中有几何图形,并且发现直接以度为单位的查找比以公里为单位要快得多,因为数据库可以跳过我认为的投影。
基本上,Place.objects.filter(location__distance__lte=(point, D(km=10)))比Place.objects.filter(location__dwithin=(point, 10))第一个查询产生表的完整扫描慢几个数量级。但有时我需要查找以公里为单位的距离阈值的地方。
是否有某种精确的方法将 10 公里转换为查询的度数?也许我应该使用另一个具有相同性能的等效查找?
我尝试使用Djangowith Geodjango,我遵循了所有文档步骤,但在尝试进行迁移时仍然遇到此错误:
OSError: [WinError 127] : The specified procedure could not be found
Run Code Online (Sandbox Code Playgroud)
这models.py是正确的,我正在从网站使用geodjango,这是我的settings.py
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'ci3qd6ti+d+#-4pae7d*)^8nmmgb2j@cacivgt8rdvsngu2$mj'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# …Run Code Online (Sandbox Code Playgroud) 我正在操作 GIS 数据并将geopandas其存储在各种Django模型中。 在引擎盖下geopandas使用,而没有。 shapelyDjango
这是一些代码:
import geopandas as gpd
from django.contrib.gis.db import models
class MyModel(models.Model):
geometry = models.PolygonField()
name = models.CharField(max_length=255, null=False, unique=True)
some_property = models.IntegerField()
gdf = gpd.read_file("some_data.geojson")
# ...do some stuff w/ gdf...
for data in gdf.to_dict("records"):
name = data.pop("name")
MyModel.objects.create_or_update(
name=name,
defaults=data,
)
Run Code Online (Sandbox Code Playgroud)
上面的代码将会失败,并出现以下错误:
类型错误:无法使用类型值设置 MyModel SpatialProxy (POLYGON):<class 'shapely.geometry.polygon.Polygon'>
除非我添加一些讨厌的代码,例如:
from django.contrib.gis.geos import fromstr, Polygon
data["geometry"] = Polygon(fromstr(str(data["geometry"])))
Run Code Online (Sandbox Code Playgroud)
有没有办法避免这种情况并直接映射 from shapelyto Django?
编辑:
以下是一些值:
>> data["geometry"] …Run Code Online (Sandbox Code Playgroud) Django 的官方文档列出了开始开发 PostGIS 应用程序所需的 3 个依赖项。他们根据数据库列出一个表。
我使用 docker 进行本地开发,但我很困惑哪些包应该安装在 Django 容器中,哪些包应该安装在 PostgreSQL 容器中。我猜其中一些应该同时存在。
我将非常感谢您对此的帮助。
geodjango ×10
django ×7
postgis ×4
python ×3
geos ×2
django-admin ×1
gdal ×1
geolocation ×1
geopandas ×1
gis ×1
heroku ×1
postgresql ×1
python-3.x ×1
shapely ×1