Я использую vectorformats
для отображения данных GeoDjango на моей карте после этот ресурс. У меня есть это в моем views.py
файле:
def geojsonFeed(request):
querySet = WorldBorder.objects.filter()
djf = Django.Django(geodjango = "mpoly", properties=['name', 'iso3'])
geoj = GeoJSON.GeoJSON()
s = geoj.encode(djf.decode(querySet))
return HttpResponse(s)
Но ответ выглядит так
["type", "features", "crs"]
Может ли кто-нибудь помочь мне определить, что не так с моим кодом?
Обновление: добавлена модель WorldBorder
class WorldBorder(models.Model):
# Regular Django fields corresponding to the attributes in the
# world borders shapefile.
name = models.CharField(max_length=50)
area = models.IntegerField()
pop2005 = models.IntegerField('Population 2005')
fips = models.CharField('FIPS Code', max_length=2)
iso2 = models.CharField('2 Digit ISO', max_length=2)
iso3 = models.CharField('3 Digit ISO', max_length=3)
un = models.IntegerField('United Nations Code')
region = models.IntegerField('Region Code')
subregion = models.IntegerField('Sub-Region Code')
lon = models.FloatField()
lat = models.FloatField()
# GeoDjango-specific: a geometry field (MultiPolygonField)
mpoly = models.MultiPolygonField()
# Returns the string representation of the model.
def __str__(self):
return self.name
Я использую Джанго 2.1.7.
Обновление 2:
>>> print(querySet)
<QuerySet [<WorldBorder: Antigua and Barbuda>, <WorldBorder: Algeria>, <WorldBorder: Azerbaijan>, <WorldBorder: Albania>, <WorldBorder: Anguilla>, <WorldBorder: Armenia>, <WorldBorder: Angola>, <WorldBorder: American Samoa>, <WorldBorder: Argentina>, <WorldBorder: Australia>, <WorldBorder: Andorra>, <WorldBorder: Gibraltar>, <WorldBorder: Bahrain>, <WorldBorder: Barbados>, <WorldBorder: Bermuda>, <WorldBorder: Bahamas>, <WorldBorder: Bangladesh>, <WorldBorder: Brunei Darussalam>, <WorldBorder: Canada>, <WorldBorder: Cambodia>, '...(remaining elements truncated)...']>
Спасибо @JohnMoutafis. Хотя векторные форматы заброшены, я повторно использовал проект для последних версий Python 3 и использовал его в своем проекте в качестве подмодуля Git. Пожалуйста, посмотрите на обновленную версию вопроса.
РЕДАКТИРОВАТЬ После подтверждения непустого набора запросов:
Я обнаружил проблему, и она связана с основным кодом модуля vectorformats
.
В частности, внутри GeoJSON.encode
на этой конкретной линии:
if to_string:
result = json_dumps(list(result_data))
list()
вызывает проблему.
Давайте воссоздадим проблему с минимальным примером:
>>> import json
>>> test = {'a': 5, 'b': [1, 2, 3], 'c': {'e': 2, 'f': 5}}
>>> list(test)
['a', 'b', 'c']
Здесь мы видим точно такое же поведение, как и в вопросе. Давайте пойдем немного дальше:
>>> json.dumps(list(test))
'["a", "b", "c"]'
Но без list()
:
>>> json.dumps(test)
'{"a": 5, "b": [1, 2, 3], "c": {"e": 2, "f": 5}}'
Поэтому есть 2 возможных решения этой проблемы:
vectorformat
, удалив вызов list()
.Вызовите метод encode
с помощью to_string=False
и самостоятельно "jsonify" полученный словарь следующим образом:
import json
def geojsonFeed(request):
queryset = WorldBorder.objects.all()
djf = Django.Django(geodjango = "mpoly", properties=['name', 'iso3'])
geoj = GeoJSON.GeoJSON()
s = geoj.encode(djf.decode(queryset), to_string=False)
return HttpResponse(json.dumps(s))
Что ж, после быстрого изучения вашего модуля кажется, что он работает так, как задумано, так что причина не в этом.
Взглянем на метод GeoJSON.encode()
:
def encode(self, features, to_string=True, **kwargs): """ Encode a list of features to a JSON object or string. to_string determines whethr it should convert the result to a string or leave it as an object to be encoded later """ results = [] result_data = None for feature in features: data = self.encode_feature(feature) for key,value in data['properties'].items(): if value and isinstance(value, str): data['properties'][key] = str(value) results.append(data) result_data = { 'type':'FeatureCollection', 'features': results, 'crs': self.crs } if to_string: result = json_dumps(list(result_data)) else: result = result_data return result
result_data
имеет структуру ["type", "features", "crs"]
и преобразуется в список json, потому что у вас есть аргумент to_string
по умолчанию True
.
Единственная причина вашей проблемы, которую я могу себе представить, заключается в том, что запрос querySet = WorldBorder.objects.filter()
имеет значение пустой.
Кстати, используя filter()
без аргументов, вы получите результат, аналогичный запросу all()
.
Спасибо, @John, за помощь. print(querySet)
возвращает это: print(querySet) <QuerySet [<WorldBorder: Antigua and Barbuda>, <WorldBorder: Algeria>, <WorldBorder: Azerbaijan>, <WorldBorder: Albania>, <WorldBorder: Anguilla>, <WorldBorder: Armenia>, <WorldBorder: Angola>, <WorldBorder: American Samoa>, <WorldBorder: Argentina>, <WorldBorder: Australia>, '...(remaining elements truncated)...']>
. Я обновил вопрос.
@ sk001 Я нашел это: D. Я добавил правку в свой ответ, которая объясняет и устраняет проблему!
Спасибо, @Джон. Теперь все в порядке. Спасибо.
Есть ли причина использовать модуль (
vectorformats
), который кажется заброшенным и очень-очень старым (страница PyPi: pypi.org/проект/векторные форматы говорит нам, что этот пакет из 2009 года и застрял в версии 0.1)? Какую версию Django вы используете для своего проекта? Кроме того, можете ли вы поделиться модельюWorldBorder
в своем вопросе?