OpenLayers開發(fā)Gis地圖

1窿锉、Gis基本介紹

GIS(Geographic Information System酌摇,地理信息系統(tǒng))是一種采集、 處理嗡载、儲存窑多、管理、分析洼滚、輸出地理空間數(shù)據(jù)及其屬性信息的計(jì)算機(jī)信息系統(tǒng)埂息。
網(wǎng)絡(luò)GIS所包含的內(nèi)容最廣泛,它包括基于各種分布式計(jì)算模型的C/S或B/S模式的遥巴、多層的千康、分布式GIS應(yīng)用,它們既可以基于J2EE框架铲掐,也可以基于COM/DCOM以及CORBA等分布式計(jì)算框架拾弃。
互聯(lián)網(wǎng)GIS或Internet GIS是網(wǎng)絡(luò)GIS的一個(gè)子集,它是基于TCP/IP協(xié)議的網(wǎng)絡(luò)GIS,因此可以部署在互聯(lián)網(wǎng)上運(yùn)行迹炼。這些GIS既可以是C/S模式也可以是B/S模式砸彬,Google公司的Google Earth軟件,就是由Google公司提供的C/S模式網(wǎng)絡(luò)地圖服務(wù)的一個(gè)客戶端軟件斯入。
因此砂碉,WebGIS是一種在Internet或Intranet環(huán)境下基于HTTP協(xié)議的用來存儲、管理刻两、分析增蹭、發(fā)布和共享地理信息的B/S模式分布式計(jì)算機(jī)應(yīng)用系統(tǒng)。

1.1磅摹、坐標(biāo)系介紹

目前國內(nèi)主要有以下三種坐標(biāo)系:
WGS84:為一種大地坐標(biāo)系滋迈,也是目前廣泛使用的GPS全球衛(wèi)星定位系統(tǒng)使用的坐標(biāo)系。
GCJ02:又稱火星坐標(biāo)系户誓,是由中國國家測繪局制訂的地理信息系統(tǒng)的坐標(biāo)系統(tǒng)饼灿。由WGS84坐標(biāo)系經(jīng)加密后的坐標(biāo)系。
BD09:為百度坐標(biāo)系帝美,在GCJ02坐標(biāo)系基礎(chǔ)上再次加密碍彭。其中bd09ll表示百度經(jīng)緯度坐標(biāo),bd09mc表示百度墨卡托米制坐標(biāo)。
非中國地區(qū)地圖庇忌,服務(wù)坐標(biāo)統(tǒng)一使用WGS84坐標(biāo)舞箍。

2、OpenLayers

OpenLayers是一個(gè)用于開發(fā)WebGIS客戶端的JavaScript包皆疹。OpenLayers 支持的地圖來源包括Google Maps疏橄、Yahoo、 Map略就、微軟Virtual Earth 等捎迫,用戶還可以用簡單的圖片地圖作為背景圖,與其他的圖層在OpenLayers 中進(jìn)行疊加残制,在這一方面OpenLayers提供了非常多的選擇立砸。
代碼實(shí)現(xiàn)了加載一個(gè)瓦片地圖的(即OpenStreetMap地圖)功能,并可以對地圖進(jìn)行平移初茶、縮放操作颗祝。 初始化一幅地圖時(shí),至少需要一個(gè)可視區(qū)域(view)恼布,一個(gè)或多個(gè)圖層(layer)螺戳,和一個(gè)地圖加載的目標(biāo)HTML標(biāo)簽(target)。

2.1折汞、初始化加載瓦片地圖

初始化一幅地圖時(shí)倔幼,至少需要一個(gè)可視區(qū)域(view),一個(gè)或多個(gè)圖層(layer)爽待,和一個(gè)地圖加載的目標(biāo)HTML標(biāo)簽(target)损同。

import React from "react";
import Map from "ol/Map";
import View from "ol/View";
import OSM from "ol/source/OSM";
import TileLayer from "ol/layer/Tile";

class GisMap extends React.Component {
  componentDidMount() {
    this.gisMap = new Map({
      target: "gisMap",
      layers: [
        new TileLayer({
          source: new OSM(),
        })
      ],
      view: new View({
        center: [0, 0],
        zoom: 2,
      }),
    });
  }

  render() {
    return <div id="gisMap" style={{ width: "100%", height: "800px" }}></div>;
  }
}
默認(rèn)地圖

OpenLayers自帶平移和縮放功能,我們也可以自己添加縮放

// 縮小地圖
zoomout = () => {
  const view = this.gisMap.getView();
  const zoom = view.getZoom();
  view.setZoom(zoom - 1);
};
// 放大地圖
zoomin = () => {
  const view = this.gisMap.getView();
  const zoom = view.getZoom();
  view.setZoom(zoom + 1);
};

可以更改坐標(biāo)投影和中心點(diǎn)來定位到中國

class GisMap extends React.Component {
  componentDidMount() {
    this.gisMap = new Map({
      target: "gisMap",
      layers: [
        new TileLayer({
          source: new OSM(),
        })
      ],
      view: new View({
        center: [116.404, 39.915], // 中心點(diǎn)
        projection: "EPSG:4326", // 坐標(biāo)系投影編碼
        zoom: 15, // 縮放等級
      }),
    });
  }
}
中國-北京

2.2鸟款、添加瓦片圖層

在初始化地圖之后還可以再次添加圖層

import TileLayer from "ol/layer/Tile";
import TileImage from "ol/source/TileImage ";

const TianMap = new TileLayer({
    source: new TileImage({
        projection: "EPSG:4326",
        maxZoom: 18,
        url: "http://t{0-4}.tianditu.com/DataServer?T=vec_w&amp;x={x}&amp;y={y}&amp;l={z}" + "&tk=be09b54c2b95cd0b6532c6f0f1c77a28"
    }),
});
this.gisMap.addLayer(TianMap)膏燃;
天地圖

添加圖層后可以控制圖層的顯示和隱藏

TianMap.setVisible(visibel);// visibel: true何什、false

2.3组哩、添加WMS地圖服務(wù)

網(wǎng)絡(luò)地圖服務(wù)(WMS)利用具有地理空間位置信息的數(shù)據(jù)制作地圖。其中將地圖定義為地理數(shù)據(jù)可視的表現(xiàn)处渣。能夠根據(jù)用戶的請求返回相應(yīng)的地圖(包括PNG伶贰,GIF,JPEG等柵格形式或者是SVG和WEB CGM等矢量形式)罐栈。WMS支持網(wǎng)絡(luò)協(xié)議HTTP黍衙,所支持的操作是由URL定義的。

WMS地圖服務(wù)發(fā)布好地圖后荠诬,可以通過url傳參params訪問到相應(yīng)的圖層

import TileWMS from "ol/source/TileWMS";

const WMSMap = new VectorLayer ({
    source: new VectorSource ({
        url: "http://gisserver.tianditu.com/tiandituService/wms?tk=be09b54c2b95cd0b6532c6f0f1c77a28",
        params: {
          VERSION: "1.1.1",
          LAYERS: "demo_city,demo_road,demo_anno", // 對應(yīng)圖層名稱
          singleTile: true,
        },
        serverType: "geoserver", // 服務(wù)類型
        transition: 0,
    }),
});
this.gisMap.addLayer(WMSMap)琅翻;
WMS地圖服務(wù)

2.4涯捻、添加矢量圖層 --- GeoJson

GeoJSON是一種對各種地理數(shù)據(jù)結(jié)構(gòu)進(jìn)行編碼的格式,基于Javascript對象表示法的地理空間信息數(shù)據(jù)交換格式望迎。GeoJSON對象可以表示幾何、特征或者特征集合凌外。GeoJSON支持下面幾何類型:點(diǎn)辩尊、線、面康辑、多點(diǎn)摄欲、多線、多面和幾何集合疮薇。GeoJSON里的特征包含一個(gè)幾何對象和其他屬性胸墙,特征集合表示一系列特征。

矢量圖層一般都是GeoJson格式的數(shù)據(jù)按咒,可以直接加載在線的GeoJson數(shù)據(jù)
加載在線GeoJson需要提供url和format屬性

import VectorLayer from "ol/layer/Vector";
import VectorSource from "ol/source/Vector";
import GeoJSON from "ol/format/GeoJSON";

const cityMap = new VectorLayer ({
    source: new VectorSource ({
        format: new GeoJSON(),
        url: "http://api.geodata.cn/saridata/Maps/Res/China_City.json",
    }),
});
this.gisMap.addLayer(cityMap)迟隅;
GeoJson-city

或者加載本地json文件,需要提供features屬性励七,通過readFeatures讀取json文件

import heatJson from "../assets/heat.json";

const heatMap = new VectorLayer ({
    source: new VectorSource ({
        features: new GeoJSON().readFeatures(heatJson),
    }),
});
this.gisMap.addLayer(heatMap)智袭;
GeoJson-heat

2.5、矢量圖層GeoJson樣式修改

OpenLayers對矢量圖層GeoJson中的要素有默認(rèn)的樣式掠抬,也可以覆寫樣式

import { Style, Circle, Fill, Stroke } from "ol/style";

const geoMap = new VectorLayer({
  source: new VectorSource({
    features: new GeoJSON().readFeatures(geoJson),
  }),
  style: new Style({
    image: new Circle({
      radius: 20,
      fill: new Fill({ color: "rgba(255, 0, 0, 0.6)" }),
      stroke: new Stroke({ color: "rgba(255, 255, 0, 0.8)", width: 5 }),
    }),
  }),
});
this.gisMap.addLayer(geoMap)吼野;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市两波,隨后出現(xiàn)的幾起案子瞳步,更是在濱河造成了極大的恐慌,老刑警劉巖腰奋,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单起,死亡現(xiàn)場離奇詭異,居然都是意外死亡氛堕,警方通過查閱死者的電腦和手機(jī)馏臭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讼稚,“玉大人括儒,你說我怎么就攤上這事∪裣耄” “怎么了帮寻?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赠摇。 經(jīng)常有香客問我固逗,道長浅蚪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任烫罩,我火速辦了婚禮惜傲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贝攒。我一直安慰自己盗誊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布隘弊。 她就那樣靜靜地躺著哈踱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梨熙。 梳的紋絲不亂的頭發(fā)上开镣,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音咽扇,去河邊找鬼邪财。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肌割,可吹牛的內(nèi)容都是我干的卧蜓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼把敞,長吁一口氣:“原來是場噩夢啊……” “哼弥奸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奋早,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤盛霎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后耽装,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愤炸,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年掉奄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了规个。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姓建,死狀恐怖诞仓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情速兔,我是刑警寧澤墅拭,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站涣狗,受9級特大地震影響谍婉,放射性物質(zhì)發(fā)生泄漏舒憾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一穗熬、第九天 我趴在偏房一處隱蔽的房頂上張望镀迂。 院中可真熱鬧,春花似錦唤蔗、人聲如沸招拙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饰序,卻和暖如春领虹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背求豫。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工塌衰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝠嘉。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓最疆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚤告。 傳聞我的和親對象是個(gè)殘疾皇子努酸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容