教你用Django实现一个简单的GIS功能
来源:互联网 发布:农村淘宝报名 编辑:程序博客网 时间:2024/05/26 12:54
地理信息系统(Geographic Information System或 Geo-Information system,GIS)有时又称为“地学信息系统”。它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。
看上去挺简单,但是实现起来是挺复杂的,这里面涉及到专用的地理数据库,图层,空间查询等等。
这里,我使用的是Django GEO框架实现一个简单的通过GPS(WGS-84坐标系)坐标查询具体城市功能。
Django是一个python敏捷开发框架,十分方便,这里就不诸多介绍了,就算没有学过,上手也是非常简单的。
django-admin.py startproject gisApp
创建一个叫gisApp的应用
然后 python manage.py startapp ChinaCity
创建了一个叫ChinaCity的可插拔模块
在gisApp目录里面的settings.py中修改INSTALLED_APPS 元组,加入’gisApp’
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'ChinaCity',
然后参考https://docs.djangoproject.com/en/1.7/ref/contrib/gis/这里把类库配置好,把数据库安装上,推荐用postgresql,因为postgresql支持的地理查询功能最强大。
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.gis', 'ChinaCity',
我们打算通过使用API调用这个查询功能,用ReSTful风格,所以用到了Django restful framework,十分易用的restful框架
pip install djangorestframework
然后再加一个配置模块
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.gis', 'rest_framework', 'ChinaCity',
到这里,环境已经配好了,可以开始写功能了
我们要用到中国的城市空间数据,在网上到处都是
下载了一份保存到ChinaCity/data/china/CHN_adm2.shp
使用django自动的扫描功能
python manage.py ogrinspect SMGIS/data/china/CHN_adm2.shp ChinaCity –mapping –multi
得到的数据如下
class ChinaCity(models.Model): id_0 = models.IntegerField() iso = models.CharField(max_length=3) name_0 = models.CharField(max_length=75) id_1 = models.IntegerField() name_1 = models.CharField(max_length=75) id_2 = models.IntegerField() name_2 = models.CharField(max_length=75) nl_name_2 = models.CharField(max_length=75) varname_2 = models.CharField(max_length=150) type_2 = models.CharField(max_length=50) engtype_2 = models.CharField(max_length=50) geom = models.MultiPolygonField(srid=-1) objects = models.GeoManager()# Auto-generated `LayerMapping` dictionary for ChinaCity modelchinacity_mapping = { 'id_0' : 'ID_0', 'iso' : 'ISO', 'name_0' : 'NAME_0', 'id_1' : 'ID_1', 'name_1' : 'NAME_1', 'id_2' : 'ID_2', 'name_2' : 'NAME_2', 'nl_name_2' : 'NL_NAME_2', 'varname_2' : 'VARNAME_2', 'type_2' : 'TYPE_2', 'engtype_2' : 'ENGTYPE_2', 'geom' : 'MULTIPOLYGON',}
稍作修改,我们在ChinaCity.models新建一个类
class ChinaCity(models.Model): id_0 = models.IntegerField() iso = models.CharField(max_length=3) name_0 = models.CharField(max_length=75) id_1 = models.IntegerField() name_1 = models.CharField(max_length=75) id_2 = models.IntegerField() name_2 = models.CharField(max_length=75) nl_name_2 = models.CharField(max_length=75) varname_2 = models.CharField(max_length=150) type_2 = models.CharField(max_length=50) engtype_2 = models.CharField(max_length=50) geom = models.MultiPolygonField(srid=4326) objects = models.GeoManager()
然后新建一个Load.py
chinacity_mapping = { 'id_0' : 'ID_0', 'iso' : 'ISO', 'name_0' : 'NAME_0', 'id_1' : 'ID_1', 'name_1' : 'NAME_1', 'id_2' : 'ID_2', 'name_2' : 'NAME_2', 'nl_name_2' : 'NL_NAME_2', 'varname_2' : 'VARNAME_2', 'type_2' : 'TYPE_2', 'engtype_2' : 'ENGTYPE_2', 'geom' : 'MULTIPOLYGON',}world_shp = os.path.abspath(os.path.join(os.path.dirname(__file__), 'data/china/CHN_adm2.shp'))def run(verbose=True): lm = LayerMapping(ChinaCity, world_shp, chinacity_mapping, transform=False, encoding='UTF-8') lm.save(strict=False, verbose=verbose)
打开shell
python manage.py shell
from gisApp.ChinaCity import Loadload.run()
这样我们就已经导入数据到空间数据库了
接下来我们要写api了
新建一个serializers.py
from rest_framework import serializersfrom .models import ChinaCityclass ChinaCitySerializer(serializers.ModelSerializer): class Meta: model = ChinaCity fields = ('name_2',)
这是一个序列化类
然后我们在views中
from rest_framework.views import APIViewfrom .models import ChinaCityfrom .serializers import ChinaCitySerializerfrom rest_framework.response import Responsefrom rest_framework import permissionsclass ChinaCityQuery(APIView): permission_classes = (permissions.AllowAny, ) def getCityObj(self, position): print position #try: return ChinaCity.objects.filter(geom__contains=position)[0] #except: #raise Http404 def get(self, request, position, format=None): position = 'POINT(' + position + ')' city = self.getCityObj(position) return Response( ChinaCitySerializer(city).data )
接下来在gisApp中的urls.py中
from ChinaCity.views import *#gisurlpatterns += [ url(r'^api/gis/city/(?P<position>[\d\s\.]+)$', ChinaCityQuery.as_view()),]
已经写好了,打开django自带的服务器
python manage.py runserver
在浏览器中打开
http://localhost:8000/api/gis/city/116.395645%2039.929986
其中最后116.395645%2039.929986是坐标
大功告成
- 教你用Django实现一个简单的GIS功能
- 用django实现一个简单的页面
- Django - 一个简单的界面显示实现
- 教你怎么快速掌握GIS(电子地图)引擎的开发,并且快速实现相应的功能特效
- 用django创建一个简单的sns
- 用txt实现一个简单的管理功能
- 用原生JS实现一个简单计算的功能实例
- Django实现的一个简单的后台开发
- 一个能够实现简单功能的计算器
- 一个mfc实现的简单计算功能
- Python Django实现简单购物车功能
- 教你实现一个简单的云计算程序
- 一步一步教你使用CGI实现一个简单的后门
- 一步一步教你使用CGI实现一个简单的后门
- django 分页功能的实现
- 一个简单的Django项目
- Django 分页的简单实现
- 一个用python编写的GIS程序-simple GIS
- 面向对象第十六课,抽象类,抽象方法
- Grails启动问题及处理
- sourcesight 与 pc_lint集成方法
- 深入理解计算机网络学习笔记--TCP
- 支付宝红包首秀失利
- 教你用Django实现一个简单的GIS功能
- Linux平台编译curl7.37.1(32位、64位)
- Android图片优化
- Effective C++读书笔记(条款35-40)
- jquery学习之基础核心
- sqlldr导入数据---笔记
- poj 1062 昂贵的聘礼 [dijkstra]
- android设置背景色为透明
- 框架和平台