Python 字节到 geojson 点
Python bytes to geojson Point
我有一个 MySQL 数据库,其中包含点类型位置数据和一个 Django(Django Rest Framework)后端,我试图在其中检索该数据。如果我尝试从 phpMyAdmin 获取该位置数据,则返回的位置类似于 POINT(23.89826 90.267535)
。但是,在我的 Django 后端中,我得到一个 bytes
作为返回位置。返回值是这样的
b'\x00\x00\x00\x00\x01\x01\x00\x00\x00\x12N\x0b^\xf4\xe57@C\xe2\x1eK\x1f\x91V@'
数据库使用 utf8mb4_unicode_ci
排序规则。
如果我尝试使用 .decode('utf-8')
将返回的字节转换为字符串,我会得到 UnicodeDecodeError
>>> s = b'\x00\x00\x00\x00\x01\x01\x00\x00\x00\x12N\x0b^\xf4\xe57@C\xe2\x1eK\x1f\x91V@'
>>> 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'\x00\x00\x00\x00\x01\x01\x00\x00\x00\x12N\x0b^\xf4\xe57@C\xe2\x1eK\x1f\x91V@'
>>> 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 模型没有处理地理数据的字段类型。我正在使用 CharField
和 max_length=255
,然后尝试解析 CharField
从数据库中检索到的任何内容。我已经使用 GeoDjango 和 Django REST Framework GIS 解决了这个问题。不需要 Django REST Framework GIS。我使用它是因为我使用的是 Django REST Framework,它以一种很好的格式输出地理数据。
步骤是
安装GDAL(地理空间数据抽象库)
sudo apt-get install gdal-bin
sudo apt-get install python3-gdal
将django.contrib.gis
和rest_framework_gis
添加到settings.INSTALLED_APPS
- 在
settings
中设置 GDAL_LIBRARY_PATH
,在我的例子中是 GDAL_LIBRARY_PATH = os.getenv('GDAL_LIBRARY_PATH')
- 将模型导入从
from django.db import models
更新为 from django.contrib.gis.db import models
- 更新模型以使用地理字段。更多:https://docs.djangoproject.com/en/2.1/ref/contrib/gis/model-api/
链接
我有一个 MySQL 数据库,其中包含点类型位置数据和一个 Django(Django Rest Framework)后端,我试图在其中检索该数据。如果我尝试从 phpMyAdmin 获取该位置数据,则返回的位置类似于 POINT(23.89826 90.267535)
。但是,在我的 Django 后端中,我得到一个 bytes
作为返回位置。返回值是这样的
b'\x00\x00\x00\x00\x01\x01\x00\x00\x00\x12N\x0b^\xf4\xe57@C\xe2\x1eK\x1f\x91V@'
数据库使用 utf8mb4_unicode_ci
排序规则。
如果我尝试使用 .decode('utf-8')
将返回的字节转换为字符串,我会得到 UnicodeDecodeError
>>> s = b'\x00\x00\x00\x00\x01\x01\x00\x00\x00\x12N\x0b^\xf4\xe57@C\xe2\x1eK\x1f\x91V@'
>>> 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'\x00\x00\x00\x00\x01\x01\x00\x00\x00\x12N\x0b^\xf4\xe57@C\xe2\x1eK\x1f\x91V@'
>>> 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 模型没有处理地理数据的字段类型。我正在使用 CharField
和 max_length=255
,然后尝试解析 CharField
从数据库中检索到的任何内容。我已经使用 GeoDjango 和 Django REST Framework GIS 解决了这个问题。不需要 Django REST Framework GIS。我使用它是因为我使用的是 Django REST Framework,它以一种很好的格式输出地理数据。
步骤是
安装GDAL(地理空间数据抽象库)
sudo apt-get install gdal-bin sudo apt-get install python3-gdal
将
django.contrib.gis
和rest_framework_gis
添加到settings.INSTALLED_APPS
- 在
settings
中设置GDAL_LIBRARY_PATH
,在我的例子中是GDAL_LIBRARY_PATH = os.getenv('GDAL_LIBRARY_PATH')
- 将模型导入从
from django.db import models
更新为from django.contrib.gis.db import models
- 更新模型以使用地理字段。更多:https://docs.djangoproject.com/en/2.1/ref/contrib/gis/model-api/
链接