簡(jiǎn)介EPSG:4326 和 EPSG: 3857
openlayers的使用中,通常有兩種坐標(biāo)系囊陡,即 EPSG:4326 和 EPSG: 3857 芳绩,未指定的情況下,默認(rèn)為 EPSG: 3857 撞反。
EPSG:4326
- EPSG:4326是一種地理坐標(biāo)系妥色,也被稱(chēng)為WGS84坐標(biāo)系。它使用經(jīng)度和緯度表示地球上的點(diǎn)位置痢畜,適合描述大范圍的地理信息垛膝,單位是度。
- 這個(gè)坐標(biāo)系常用于描述地理信息數(shù)據(jù)丁稀,如地圖吼拥、GPS等。因?yàn)檫@種投影方式可以將地球表面展平成一個(gè)矩形线衫,便于在網(wǎng)絡(luò)上傳輸和顯示地圖瓦片凿可。
- 數(shù)據(jù)格式:一般是這種的[22.37,114.05];
- 坐標(biāo)范圍是-180到+180的經(jīng)度和-90到+90的緯度枯跑。
- 特點(diǎn):利于存儲(chǔ)惨驶,可讀性高。
- 缺點(diǎn):會(huì)導(dǎo)致頁(yè)面變形敛助。
EPSG:3857
- EPSG:3857是一種投影坐標(biāo)系粗卜,也被稱(chēng)為Web墨卡托投影。它使用x和y坐標(biāo)表示地球上的點(diǎn)位置纳击,適合在Web環(huán)境下顯示地圖续扔,單位是米。
- 通常用于 GPS 設(shè)備和地理標(biāo)記(例如 Google Maps API 或 OpenStreetMap)焕数,因?yàn)樗苯訉?duì)應(yīng)于地球表面的地理位置纱昧。
- 數(shù)據(jù)格式:一般是這種[12914838.35,4814529.9];
- 坐標(biāo)范圍是-20026376.39到20026376.39(西經(jīng)到東經(jīng))堡赔,以及-20048966.10到20048966.10(南緯到北緯)识脆。
- 對(duì)墨卡托投影來(lái)說(shuō),越到高緯度善已,大小扭曲越嚴(yán)重灼捂,到兩極會(huì)被放到無(wú)限大,所以换团,墨卡托投影無(wú)法顯示極地地區(qū)纵东。WGS84范圍:-180.0 ,-85.06啥寇,180.0, 85.06洒扎。
- 特點(diǎn):用于分析辑甜,顯示數(shù)據(jù)。
- 缺點(diǎn):數(shù)據(jù)的可讀性差和數(shù)值大存儲(chǔ)比較占用內(nèi)存袍冷。
在實(shí)際開(kāi)發(fā)中磷醋,因?yàn)閙ap源數(shù)據(jù)大部分都是EPSG:4326的數(shù)據(jù)源格式的數(shù)據(jù),但是使用EPSG:4326的坐標(biāo)系地圖會(huì)出現(xiàn)被壓縮的感覺(jué)胡诗。所以我們都是采用 EPSG:3857的坐標(biāo)系類(lèi)型邓线,把數(shù)據(jù)源轉(zhuǎn)換位 EPSG:3857的數(shù)據(jù)源即可。但是這個(gè)EPSG:3857數(shù)據(jù)源不易讀取和值占內(nèi)存原因煌恢,所有結(jié)合兩者的缺點(diǎn)骇陈,我們采用坐標(biāo)轉(zhuǎn)換,即 EPSG:4326轉(zhuǎn) EPSG:3857瑰抵。 所有請(qǐng)理解這句話(huà):通常:數(shù)據(jù)存儲(chǔ)在EPSG:4326中你雌,顯示在EPSG:3857中。
openlayers的代碼中涉及到投影坐標(biāo)的位置
view中設(shè)置投影
在 openlayers 中創(chuàng)建map時(shí)候會(huì)有個(gè)view 屬性二汛,projection 屬性指定坐標(biāo)系的類(lèi)型婿崭,一般是4326和3857兩種拨拓。
- view屬性下面會(huì)存在一個(gè)center屬性。這個(gè)屬性就是設(shè)置中心位置的坐標(biāo)氓栈。需要根據(jù)坐標(biāo)系類(lèi)型設(shè)置值渣磷,單位要對(duì)應(yīng)上,度還是米授瘦。
new View({
projection:'EPSG:3857',//坐標(biāo)系類(lèi)型醋界,默認(rèn)是'EPSG:3857'
//還可設(shè)置為'EPSG:4326'
center: fromLonLat([104.912777, 34.730746]), //地圖中心坐標(biāo),
// 數(shù)組中 第一個(gè)值表示經(jīng)度值,第二個(gè)值是緯度值
});
使用useGeographic()奥务,以下兩段代碼效果是等價(jià)的
import { useGeographic } from "ol/proj.js";
useGeographic();
view: new View({
center: [0, 0],
zoom: 2,
projection: "EPSG:4326",
}),
坐標(biāo)轉(zhuǎn)換方法
從 EPSG:4326 轉(zhuǎn)換到 EPSG:3857:
const lonlat = [10, 20];
const webmercator = ol.proj.transform(lonlat, 'EPSG:4326', 'EPSG:3857');
從 EPSG:3857 轉(zhuǎn)換到 EPSG:4326:
const webmercator = [1234567, 2345678];
const lonlat = ol.proj.transform(webmercator, 'EPSG:3857', 'EPSG:4326');
加載geojson文件時(shí)的坐標(biāo)設(shè)置
dataProjection是源坐標(biāo)系,即要繪制的geojson中存放的坐標(biāo)的坐標(biāo)系統(tǒng). featureProjection是目標(biāo)地圖視窗的坐標(biāo)系統(tǒng),即目標(biāo)坐標(biāo)系.
目標(biāo)坐標(biāo)系為 4326:
var vectorSource = new ol.source.Vector({
features: (new ol.format.GeoJSON()).readFeatures(geojsonObject, {
dataProjection: 'EPSG:4326',
featureProjection:'EPSG:4326' })
});
目標(biāo)坐標(biāo)系為 3857:
var vectorSource = new ol.source.Vector({
features: (new ol.format.GeoJSON()).readFeatures(geojsonObject, {
dataProjection: 'EPSG:4326',
featureProjection:'EPSG:3857' })
});
transform和toLonLat的區(qū)別
- 有關(guān)坐標(biāo)轉(zhuǎn)換的包都在ol/proj中物独,其中EPSG:3857和EPSG:4326坐標(biāo)系之間的轉(zhuǎn)換有transform、fromLonLat氯葬、toLonLat
- fromLonLat是將EPSG:4326轉(zhuǎn)換為EPSG:3857挡篓;
- toLonLat是將EPSG:3857轉(zhuǎn)換為EPSG:4326
transform的轉(zhuǎn)換和toLonLat的區(qū)別是:transform轉(zhuǎn)換之后的經(jīng)度可能是幾千,而toLonLat轉(zhuǎn)換之后的經(jīng)度位于[-180, 180]之間帚称。
因?yàn)榈貓D是不斷拓展的官研,一個(gè)地方一直往右拖,同一個(gè)地方的經(jīng)度是±360的變化
//3857=>4326
let coordinate = transform(
evt.coordinate,
"EPSG:3857",
"EPSG:4326"
)
let x = coordinate[0];
let flag = (x + 180) % 360;
if(flag > 0) {
flag -= 180;
} else {
flag += 180;
}
coordinate[0] = flag;
//等價(jià)于
let coordinate = toLonLat(evt.coordinate);