Python bytes to geojson Point



我有一个MySQL数据库,其中有点类型位置数据和Django(Django Rest Framework(后端,我正在尝试检索该数据。如果我尝试从phpMyAdmin获取该位置数据,则返回的位置类似于POINT(23.89826 90.267535)。然而,在我的 Django 后端中,我得到了一个bytes作为返回的位置。返回的值是这样的b'x00x00x00x00x01x01x00x00x00x12Nx0b^xf4xe57@Cxe2x1eKx1fx91V@'

数据库使用utf8mb4_unicode_ci排序规则。

如果我尝试将返回的字节转换为字符串,我会得到UnicodeDecodeError.decode('utf-8')

>>> s = b'x00x00x00x00x01x01x00x00x00x12Nx0b^xf4xe57@Cxe2x1eKx1fx91V@'
>>> s.decode('utf-8')
Traceback (most recent call last):
File "<console>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf4 in position 13: invalid continuation byte

即使我使用 MySQL 函数St_AsGeoJson(location)从 Django 执行原始查询,我也得到相同的字节数组。

然后我尝试了geojson。当我将该字节馈送到geojson.Point()时,我得到了一个 geojson,但coordinates数组包含 25 个整数值,而不是 2 个浮点数。

>>> s = b'x00x00x00x00x01x01x00x00x00x12Nx0b^xf4xe57@Cxe2x1eKx1fx91V@'
>>> geojson.Point(s)
{"coordinates": [0, 0, 0, 0, 1, 1, 0, 0, 0, 18, 78, 11, 94, 244, 229, 55, 64, 67, 226, 30, 75, 31, 145, 86, 64], "type": "Point"}

如何从字节或此 geojson 中检索点数据?

我遇到了这个问题,因为我使用的是普通的Django,而Django模型没有处理Geo数据的字段类型。我正在使用带有max_length=255CharField,然后尝试解析CharField从数据库中检索到的任何内容。我已经通过使用GeoDjango和Django REST Framework GIS解决了这个问题。Django REST Framework GIS 不是必需的。我使用它是因为我正在使用Django REST框架,它以漂亮的格式输出Geo数据。

步骤是

  1. 安装 GDAL(地理空间数据抽象库(

    sudo apt-get install gdal-bin sudo apt-get install python3-gdal

  2. django.contrib.gisrest_framework_gis添加到settings.INSTALLED_APPS

  3. settings中设置GDAL_LIBRARY_PATH,就我而言,它是GDAL_LIBRARY_PATH = os.getenv('GDAL_LIBRARY_PATH')
  4. 将模型导入从from django.db import models更新为from django.contrib.gis.db import models
  5. 更新模型以使用 Geo 字段。更多: https://docs.djangoproject.com/en/2.1/ref/contrib/gis/model-api/

链接

  • https://docs.djangoproject.com/en/2.1/ref/contrib/gis/
  • https://github.com/djangonauts/django-rest-framework-gis
  • https://github.com/domlysz/BlenderGIS/wiki/How-to-install-GDAL

最新更新