概述:

一年一度的高考今天开始了,回想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>

---------------------------------------------------------------------------------------------------------------

技术博客

CSDN:http://blog.csdn.NET/gisshixisheng

博客园:http://www.cnblogs.com/lzugis/

在线教程

http://edu.csdn.Net/course/detail/799

Github

https://github.com/lzugis/

联系方式

q       q:1004740957

e-mail:niujp08@qq.com

公众号:lzugis15

Q Q 群:452117357(webgis)

             337469080(Android)

posted on 2017-06-07 13:19  LZU-GIS  阅读(242)  评论(0编辑  收藏  举报