一个GISER 6.7的祝福

概述:

一年一度的高考今天开始了,回想10年前,那是我第一次高考;10年后,作为一个GISER,在此给大家献上一个GISER的祝福,祝愿各位考生:考神附体,考完报考GIS专业(LZUの,给自己的母校打个广告)……

内容:

1、爬取全国的高校的数据;

2、根据天地图的接口,获取高校的经纬度;

3、将数据制作成shp,并转换为geojson;

4、制作全国高校WEBGIS展示图。

效果:

爬取数据,保存为txt

将txt用Excel打开并另存为

在Arcmap中转换为shp

将shp转换为geojson

WEBGIS中展示

实现:

1、获取高校数据

	public JSONObject getUrlContent(String url) throws IOException, JSONException{
		JSONObject json = null;
		InputStream is = null;
		try {
			is = new URL(url).openStream();
			BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
		    StringBuilder sb = new StringBuilder();
		    int cp;
		    while ((cp = rd.read()) != -1) {
		        sb.append((char) cp);
		    }
		    String strJson = sb.toString().substring(7,sb.toString().length()-2);
		    json = new JSONObject(strJson);
		    is.close();
		} 
		catch (IOException e) {
			e.printStackTrace();
		}
		return json;
	}
	public String[] getLonLatByName(String name){
		String[] lonlat = new String[]{"99","99"};
		String url = "http://api.tianditu.com/apiserver/ajaxproxy?proxyReqUrl=http://map.tianditu.com/query.shtml?postStr={'keyWord':'"+name+"','level':'3','mapBound':'29.88281,-23.56399,170.50781,53.54031','queryType':'7','start':'0','count':'1'}&type=query";
		InputStream is = null;
		try {
			is = new URL(url).openStream();
			BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
		    StringBuilder sb = new StringBuilder();
		    int cp;
		    while ((cp = rd.read()) != -1) {
			    sb.append((char) cp);
			}
			String strJson = sb.toString().substring(19,sb.toString().length()-1);
		    JSONObject json = new JSONObject(strJson);
		    JSONArray arr = new JSONArray();
		    if(!json.isNull("pois")){
		    	arr = json.getJSONArray("pois");
		    	JSONObject poiinfo = (JSONObject) arr.get(0);
			    lonlat = poiinfo.get("lonlat").toString().split(" ");
			    is.close();
		    }
		}
		catch (IOException | JSONException e) {
	    	e.printStackTrace();
	    }
	    return lonlat;
	}

2、用GDAL实现shp转geojson

# -*- coding: utf-8 -*-
import sys
from osgeo import gdal
from osgeo import ogr

#读取shap文件
def shp2json():
    #为了支持中文路径,请添加下面这句代码 
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO")  
    #为了使属性表字段支持中文,请添加下面这句
    gdal.SetConfigOption("SHAPE_ENCODING","")  
    #注册所有的驱动 
    ogr.RegisterAll()  
    #数据格式的驱动
    driver = ogr.GetDriverByName('ESRI Shapefile')
    ds = driver.Open(r'D:\data\gdal\university.shp');
    if ds is None:
        print "打开文件失败!"
        sys.exit(1)
    dv = ogr.GetDriverByName("GeoJSON")
    if dv is None:
        print "打开驱动失败!"
        sys.exit(1)
    dv.CopyDataSource(ds, r"D:\data\gdal\university.geojson")
    ds.Destroy()
    print "转换成功!"

def main():
    shp2json();
    
if __name__ == "__main__":
    main();

3、展示数据

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>百度样式地图</title>
	<link rel="stylesheet" href="https://openlayers.org/en/v4.1.1/css/ol.css" type="text/css">
	<style type="text/css">
		body, #map {
			border: 0px;
			margin: 0px;
			padding: 0px;
			width: 100%;
			height: 100%;
			font-size: 13px;
			overflow: hidden;
		}
		#map{ 
			background: url("../../images/bgImg.gif");
			background-repeat: inherit;
		}
	</style>
	<!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>
    <script src="https://openlayers.org/en/v4.1.1/build/ol.js"></script>
    <script type="text/javascript" src="../../../../plugin/jquery/jquery-1.8.3.js"></script>
	<script type="text/javascript">
		function init(){
		    var projection = ol.proj.get("EPSG:3857");
		    var resolutions = [];
		    for(var i=0; i<19; i++){
		        resolutions[i] = Math.pow(2, 18-i);
		    }
		    var tilegrid  = new ol.tilegrid.TileGrid({
		        origin: [0,0],
		        resolutions: resolutions
		    });
		    
		    function getBaiduCustomimage(customid){
		    	var baidu_source = new ol.source.TileImage({
			        projection: projection,
			        tileGrid: tilegrid,
			        tileUrlFunction: function(tileCoord, pixelRatio, proj){
			            if(!tileCoord){
			                return "";
			            }
			            var z = tileCoord[0];
			            var x = tileCoord[1];
			            var y = tileCoord[2];
			
			            if(x<0){
			                x = "M"+(-x);
			            }
			            if(y<0){
			                y = "M"+(-y);
			            }
			            return "http://api2.map.bdimg.com/customimage/tile?&x="+x+
			            	"&y="+y+"&z="+z+
			            	"&udt=20170428&scale=1&ak=E4805d16520de693a3fe707cdc962045&customid="+customid;
			        }
			    });
			    return new ol.layer.Tile({
			        source: baidu_source
			    });
		    }
			/**
			 * 默认地图样式(normal)
			 * 清新蓝风格(light)
			 * 黑夜风格(dark)
			 * 红色警戒风格(redalert)
			 * 精简风格(googlelite)
			 * 自然绿风格(grassgreen)
			 * 午夜蓝风格(midnight)
			 * 浪漫粉风格(pink)
			 * 青春绿风格(darkgreen)
			 * 清新蓝绿风格(bluish)
			 * 高端灰风格(grayscale)
			 * 强边界风格(hardedge)
			 */
		    var baidu_layer = getBaiduCustomimage("midnight");
			var province = new ol.layer.Image({
		        source: new ol.source.ImageWMS({
			          ratio: 1,
			          url: 'http://10.16.48.185:8086/geoserver/bj_grid/wms',
			          params: {
			          		'FORMAT': 'image/png',
			                'VERSION': '1.1.1',
			                STYLES: '',
			                LAYERS: 'bj_grid:province_line',
			          }
		        })
		    });
		    $.get("../data/university.geojson",null,function(result){
					result = eval("("+result+")");
				    var features = (new ol.format.GeoJSON()).readFeatures(result);
				    for(var i=0;i<features.length;i++){
				    	var _feature = features[i];
				    	var _geom = features[i].getGeometry();
						_geom.transform('EPSG:4326', 'EPSG:3857');
				    	_feature.setGeometry(_geom);
				    }
				    var vectorSource = new ol.source.Vector({
				        features: features
				    });
					var vector = new ol.layer.Vector({
						source: vectorSource,
						style: new ol.style.Style({
				          image: new ol.style.Circle({
						        radius: 3,
						        fill: new ol.style.Fill({
									color: "rgba(0,255,255,0.5)"
								})
						    })
				        })
					});
					var map = new ol.Map({
				        target: 'map',
				        layers: [baidu_layer, province, vector],
				        view: new ol.View({
				            center: ol.proj.transform([104.214, 35.847], 'EPSG:4326', 'EPSG:3857'),
				            zoom: 4
				        })
				    });
				});
	   }
	</script>
</head>
<body onLoad="init()">
<div id="map">
</div>
</body>
</html>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏me的随笔

模板方法模式实践

在实际编程中,会经常遇到多个类中的某些方法实现逻辑类似的情况,这时我们可以将这些类中的相同部分抽象到父类中,对于有差异的地方,子类根据自身的实际需求来各自实现。

11220
来自专栏SDNLAB

ONOS集群选举分析

首先简单介绍下自己,之前是做 floodlight 控制器开发的,鉴于 ODL 和 onos 的如火如荼的发展,如果不对了解点就感觉自己 OUT 了,因此忙里偷...

37660
来自专栏海天一树

小朋友学C语言(29):switch case语句

switch case语句与if elseif语句类似,都是从多个选择条件里选取一个来执行。 (一)先来看一个if elseif程序 #include <std...

34090
来自专栏大内老A

[ASP.NET MVC]为HtmlHelper添加一个RadioButtonList扩展方法

在前面一篇文章中,我们通过对HtmlHelper的扩展简化了对DropDownList(Single-Line-Select)和ListBox(Multiple...

227100
来自专栏岑玉海

WF追忆

  前一阵子学习了一下工作流,现在写个总结记录一下这个过程。要弄工作流,首先就要有个界面来画图,做web的,没办法,只能选择javascript和silverl...

29460
来自专栏菩提树下的杨过

c#:使用using关键字自动释放资源未必一定就会有明显好处

记录这篇文章的灵感来源来自今天下班前与同事的小小争论,我现在开发的一个项目中,有这样一段代码: public string ToXML() { ...

22980
来自专栏偏前端工程师的驿站

网页优化系列三:使用压缩后置viewstate

  Asp.net中的服务器控件都启用了viewstate,虽然方便了开发人员,但页面大小及性能上确实有所影响,对于无需viewstate的控件及页面可以直接把...

22560
来自专栏大内老A

我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承

当今的IT领域,SOA已经成为了一个非常时髦的词,对SOA风靡的程度已经让很多人对SOA,对面向服务产生误解。其中很大一部分人甚至认为面向服务将是面向对象的终结...

20150
来自专栏跟着阿笨一起玩NET

AutoResetEvent.WaitAll 等到人生三大事,然后大笑开心。

例子描述:人生都有追求幸福理想,下面就用三条线程得到房子,车子,妻子,等待全部得到后,显示人生圆满。

29420
来自专栏tkokof 的技术,小趣及杂念

Sweet Snippet 系列之 有序列表

很朴素的一种想法,为了维持 List 有序,我们可以在 Add 操作之后进行 Sort 操作(Remove 操作后不需要重新 Sort):

5510

扫码关注云+社区

领取腾讯云代金券