我正在使用GeoDjango和PostGIS.然后我就如何从我的postgres db表中的给定坐标获取最近的记录而遇到麻烦.
在我的旧 MacBook 坏掉后,我正在将我一直在构建的 Django Web 应用程序转移到我的新机器(MacBook Pro M1 2021)上。我目前正在为应用程序重新安装正确的软件包和扩展。
但是,当我这样做时,我目前收到以下错误python3 manage.py runserver:
django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library
(tried "gdal", "GDAL", "gdal3.3.0", "gdal3.2.0", "gdal3.1.0",
"gdal3.0.0", "gdal2.4.0", "gdal2.3.0", "gdal2.2.0", "gdal2.1.0", "gdal2.0.0").
Is GDAL installed? If it is, try setting GDAL_LIBRARY_PATH in your settings.
Run Code Online (Sandbox Code Playgroud)
我创建的数据库是通过 Postgres.app 上的服务器创建的,我相信它是与 PostGIS、GDAL 等打包在一起的。
我也跑过pip3 install GDAL并且brew install GDAL
我尝试遵循geoDjango 文档,并在终端中添加了以下内容:
export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/14/bin
Run Code Online (Sandbox Code Playgroud)
当我运行时which psql它返回:/Applications/Postgres.app/Contents/Versions/14/bin/psql
我想不通。
错误的完整回溯:
Watching for file changes with StatReloader
Exception in …Run Code Online (Sandbox Code Playgroud) 我已经使用openlayers和OpenStreetMaps运行管理应用程序运行geodjango .
现在我想写一些视图来显示数据.基本上,我只想在地图中添加一个点列表(在管理员中看到).
Geodjango似乎使用了一个特殊的 openlayers.js文件来管理它.有没有一种很好的方式与此接口?
如何编写视图/模板以在打开的街道地图窗口中显示geodjango数据,如管理员所示?
目前,我正在挖掘openlayers.js文件和api寻找一个"简单"的解决方案.(我没有经验,所以这需要一些时间.)
我可以看到的当前方式是将以下内容添加为模板,并使用django添加显示点所需的代码.(根据这里的例子)
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Draw Feature Example</title>
<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript">
var map;
function init(){
map = new OpenLayers.Map('map');
var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
"http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
map.addLayer(layer);
/*
* Layer style
*/
// we want opaque external graphics and non-opaque internal graphics
var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
layer_style.fillOpacity = 0.2;
layer_style.graphicOpacity = 1;
/*
* Blue style
*/
var …Run Code Online (Sandbox Code Playgroud) 我想在业余时间建立一个小型GIS,并一直在挖掘Geodjango.
我一直试图找到开源Geodjango项目的例子,但我运气不好,所以我在这里.我已经浏览了大部分可以找到的教程,但它们似乎都停留在同一点上,我很想看一些更复杂的现实代码.
有人知道我能在哪里找到一些吗?任何东西都足够了,但使用Google Earth API而不是Open Layers的东西是理想的.
我有以下(简化)模型:
class Zone(gismodels.Model):
name = gismodels.CharField()
poly = gismodels.PolygonField()
Run Code Online (Sandbox Code Playgroud)
我想基于给定的点和半径创建并保存表示圆的多边形.
我可以弄清楚如何实现这一点的唯一方法是使用原始SQL调用postgis ST_Buffer函数.我真的希望还有另一种方式.
是否可以访问GEOS缓冲区方法?
我正在尝试使用GeoDjango的LayerMapping功能将我的KML文件导入模型.我正在进行测试,在进行常规导入时没有问题.但是,我最近在我的模型中添加了一个外键.我的模型叫做PlaceMark,它现在有一个名为Layer的模型的FK.我想要
这是我如何从shell测试和相关的错误:
>>>from locator import load
>>>load.run()
...
TypeError: ForeignKey mapping must be of dictionary type.
....
Run Code Online (Sandbox Code Playgroud)
这是我的load.py档案:
import os
from django.contrib.gis.utils import LayerMapping
from models import PlaceMark
placemark_mapping = {
'name' : 'Name',
'description' : 'Description',
# This line below is the one that is suspect #
'layer': 'Layer',
'geom' : 'POINT25D',
}
placemark_kml = os.path.abspath(os.path.join(os.path.dirname(__file__), 'data/claim.kml'))
def run(verbose=True):
lm = LayerMapping(PlaceMark, placemark_kml, placemark_mapping,
transform=False, encoding='iso-8859-1')
lm.save(strict=True, verbose=verbose)
Run Code Online (Sandbox Code Playgroud)
KML文件:
<?xml version="1.0" encoding="Windows-1252"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Folder> …Run Code Online (Sandbox Code Playgroud) 嗨我有一个Django模型如下:
class Address(models.Model):
geoCoords = models.PointField(null=True, blank=True,)
Run Code Online (Sandbox Code Playgroud)
现在我创建一个这个模型的实例:
A = Address()
Run Code Online (Sandbox Code Playgroud)
如何将A的geoCoord字段的坐标设置为(5.3,6.2)?我找不到以这种方式分配点字段的任何示例.这是一个非常简单的问题.实际上,我想分配给A.geoCord的坐标来自pygeocoder.它是一个2项元组的花车.
关于Django PointFields的文档基本上是不存在的.
我正在学习如何使用Geo Django.当用户注册时,我保存纬度和经度信息,如下所示:
from django.contrib.gis.db import models
from django.contrib.gis.geos import Point
class GeoModel(models.Model):
"""
Abstract model to provide GEO fields.
"""
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)
class Meta:
abstract = True
def save(self, *args, **kwargs):
if self.latitude and self.longitude:
self.location = Point(float(self.latitude), float(self.longitude))
super(GeoModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
接下来我想添加一个名为city**的新字段**我想存储城市"名称",即伦敦基于给出的长和纬度细节.
我已经看过django-cities从Geo Name保存城市数据库的位置,但这看起来有些过分而且不兼容Python 3所以不适合我.我见过一个名为geopy的软件包,但这似乎完全取代了Geo Django并使用了带有限制的Google API.
我想坚持使用Geo Django并以某种方式进行查找以找出基于long和lat的城市名称,那么我的选择是什么?即.
接近这个是正确的方法吗?如果是这样,我如何将数据存入我的数据库,然后使用Geo Django查找城市名称?
我正在尝试设置一个GeoDjango应用程序来测试我遇到的早期问题.我已经建立了一个postgresql数据库,创建了一个新的Django项目和应用程序,但是当我尝试时./manage.py syncdb我得到了这个:
django.core.exceptions.ImproperlyConfigured:无法确定数据库"django_geotest"的PostGIS版本.GeoDjango至少需要PostGIS 1.3版.是否从空间数据库模板创建了数据库?
我不明白,因为我之前已经完成了GeoDjango的所有安装要求,并django_geotest通过这样做创建了这个数据库:
$ createdb -T template_postgis django_geotest
Run Code Online (Sandbox Code Playgroud)
看起来数据库设置正确:
django_geotest=# SELECT PostGIS_full_version();
postgis_full_version
-------------------------------------------------------------------------------------------------------
POSTGIS="1.5.3" GEOS="3.2.2-CAPI-1.6.2" PROJ="Rel. 4.7.1, 23 September 2009" LIBXML="2.7.3" USE_STATS
(1 row)
Run Code Online (Sandbox Code Playgroud)
描述数据库,我得到这个:
django_geotest=# \d
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+-------
public | geography_columns | view | phil
public | geometry_columns | table | phil
public | spatial_ref_sys | table | phil
(3 rows)
Run Code Online (Sandbox Code Playgroud)
所以现在我不知道接下来要尝试什么...我对postgresql及其模板等的了解并不是那么好.有任何想法吗?谢谢.
PointField是否有一个小部件作为单独的纬度/经度输入?就像DateTimeField的SplitDateTimeWidget一样.
geodjango ×10
django ×7
python ×5
postgis ×3
gis ×2
postgresql ×2
django-forms ×1
gdal ×1
geos ×1
mapping ×1
openlayers ×1