GeoJSON 数据不包含有意义的数据 GeoDjango

Posted

技术标签:

【中文标题】GeoJSON 数据不包含有意义的数据 GeoDjango【英文标题】:GeoJSON data doesn't contain meaningful data GeoDjango 【发布时间】:2019-04-10 15:09:31 【问题描述】:

我正在使用vectorformats 在我的地图上显示 GeoDjango 数据,遵循this resource。我的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

我正在使用 Django 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/project/vectorformats 告诉我们这个包是从 2009 年开始的并且卡在版本中0.1)?您用于项目的 Django 版本是什么?另外,您能否分享您问题中的WorldBorder 模型? 谢谢@JohnMoutafis。尽管 vectorformats 已被放弃,但我已重用 the poject for recent Python 3 versions 并将其用作我的项目中的 Git 子模块。请查看问题的更新版本。 【参考方案1】:

编辑确认非空查询集后:

我发现了这个问题,它与vectorformats模块的核心代码有关。

具体来说,在GeoJSON.encodeon this specific line内部:

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'

因此,围绕这个问题有两种可能的解决方案:

    更改vectorformat 代码删除list() 调用。

    使用to_string=False 调用encode 方法,然后自己“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() 查询是empty

顺便说一句,通过使用不带参数的filter(),您可以得到与all() 查询类似的结果。

【讨论】:

感谢@John,感谢您的帮助。 print(querySet) 返回:print(querySet) &lt;QuerySet [&lt;WorldBorder: Antigua and Barbuda&gt;, &lt;WorldBorder: Algeria&gt;, &lt;WorldBorder: Azerbaijan&gt;, &lt;WorldBorder: Albania&gt;, &lt;WorldBorder: Anguilla&gt;, &lt;WorldBorder: Armenia&gt;, &lt;WorldBorder: Angola&gt;, &lt;WorldBorder: American Samoa&gt;, &lt;WorldBorder: Argentina&gt;, &lt;WorldBorder: Australia&gt;, '...(remaining elements truncated)...']&gt;。我更新了问题。 @sk001 我找到了:D。我在我的答案中添加了一个编辑来解释和解决问题! 谢谢你,@John。现在好了。谢谢。

以上是关于GeoJSON 数据不包含有意义的数据 GeoDjango的主要内容,如果未能解决你的问题,请参考以下文章

MapBox GL-主题化地基于客户端中的数据渲染GeoJson

cesium 何如加载大数据量的geojson格式的数据,geojson有切片吗

GIS风暴GeoJSON数据格式案例全解

ArcGIS风暴如何将矢量数据(点线面)折点坐标转为GeoJSON格式?

ArcGIS风暴如何将矢量数据(点线面)折点坐标转为GeoJSON格式?

GeoJson 世界数据库 [关闭]