Данные GeoJSON не содержат значимых данных GeoDjango

Я использую 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)...']>

Есть ли причина использовать модуль (vectorformats), который кажется заброшенным и очень-очень старым (страница PyPi: pypi.org/проект/векторные форматы говорит нам, что этот пакет из 2009 года и застрял в версии 0.1)? Какую версию Django вы используете для своего проекта? Кроме того, можете ли вы поделиться моделью WorldBorder в своем вопросе?

John Moutafis 11.04.2019 10:21

Спасибо @JohnMoutafis. Хотя векторные форматы заброшены, я повторно использовал проект для последних версий Python 3 и использовал его в своем проекте в качестве подмодуля Git. Пожалуйста, посмотрите на обновленную версию вопроса.

sk001 11.04.2019 14:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

РЕДАКТИРОВАТЬ После подтверждения непустого набора запросов:

Я обнаружил проблему, и она связана с основным кодом модуля 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 возможных решения этой проблемы:

  1. Измените код vectorformat, удалив вызов list().
  2. Вызовите метод 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 12.04.2019 00:57

@ sk001 Я нашел это: D. Я добавил правку в свой ответ, которая объясняет и устраняет проблему!

John Moutafis 12.04.2019 10:16

Спасибо, @Джон. Теперь все в порядке. Спасибо.

sk001 12.04.2019 10:26

Другие вопросы по теме