成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

地圖繪制初探——基于maptalks的2.5D地圖繪制

qylost / 3032人閱讀

摘要:下面,以貴州省的偽地圖為例,進(jìn)行代碼的編寫和相應(yīng)數(shù)據(jù)的簡單處理。根據(jù)問答如何合并區(qū)域邊界,訪問在線的地圖數(shù)據(jù)處理網(wǎng)站,給每個(gè)縣市取一個(gè)相同的別名,一番輸入輸出,我們就得到了貴州省的外邊界。

進(jìn)行圖形可視化,難免會(huì)遇到地理數(shù)據(jù)的可視化需求。通常情況下,直接使用echarts對(duì)配置項(xiàng)進(jìn)行處理,就可以滿足大部分需求。當(dāng)然,更加復(fù)雜的定制化需求,可能就需要借助d3、Three.js等工具。如果對(duì)詳細(xì)的地圖背景有要求的話,又需要將圖形庫與leaflet、maptalks等地圖引擎相結(jié)合。
不過也許你的需求和我一樣,沒有那么復(fù)雜的交互需求,但對(duì)顯示效果卻有一些想法。那么就可以嘗試閱讀本文,使用一種比較偷懶的方法,僅基于maptalks本身,來繪制可交互的偽3d地圖。
下面,以貴州省的偽3d地圖為例,進(jìn)行代碼的編寫和相應(yīng)數(shù)據(jù)的簡單處理。

1.基本的地圖繪制
maptalks(maptalks的git)的官方范例寫得相當(dāng)親切,我們可以從中找到所有繪制偽3d地圖需要的元素。
首先,從地圖底圖開始。(官方入門示例)

initMapTalk() {
  let map = new maptalks.Map("mapDom", {
    center: [121.345, 31.2088],
    zoom: 9,
    baseLayer: new maptalks.TileLayer("base", {
      urlTemplate: "http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
      subdomains: ["a","b","c","d"],
      attribution: "© OpenStreetMap contributors, © 

需要注意的是,除了maptalks.js以外,maptalks.css也是必須引入的。

然后,我們需要借助maptalks.Polygon添加一些地圖區(qū)塊(Polygon示例)。雖然地圖看起來和長方體不太一樣,實(shí)際上這些區(qū)塊也不過是稍微復(fù)雜一些的點(diǎn)線集合而已。作為一切繪制的基礎(chǔ),我們需要找一些GeoJson格式的數(shù)據(jù)(中國各省市級(jí)json,世界主要國家json)。觀察GeoJson,其中,的coordinates屬性,就是地圖邊界的集合。需要注意的是,區(qū)域type包含Polygon和MultiPolygon兩類,和maptalks的多邊形函數(shù)相對(duì)應(yīng),在數(shù)組的層級(jí)上稍有區(qū)別。為了減少數(shù)據(jù)選取的麻煩,這里選擇使用MultiPolygon來進(jìn)行繪制。

drawPolygons(idx, coordinates, properties) {
    const polygon = new maptalks.MultiPolygon(coordinates, {
      symbol: {
        lineWidth: 1,
        lineColor: edgeColor,
        polygonFill: polygonColors[0],
        polygonOpacity: 0.5
      },
      properties: {
        id: properties.id,
        index: idx,
        properties: properties
      }
    })
    .on("mouseenter", function(e) {
      e.target.updateSymbol({
        polygonFill: polygonColors[1]
      });
    })
    .on("mouseout", function(e) {
      e.target.updateSymbol({
        polygonFill: polygonColors[0]
      });
    })
    this.polygons.push(polygon);
},
drawRegion() {
    const self = this
    $.getJSON("guizhou.json", "", function(mapData) {
      const features = mapData.features;
      features.forEach((g, i) => {
        const properties = g.properties;
        const coordinates = g.geometry.coordinates
        self.drawPolygons(i, coordinates, properties)
      });
      const polygonsLayer = new maptalks.VectorLayer(
        "vector-polygon",
        self.polygons,
      ).addTo(self.mapDom);
    })
},

到現(xiàn)在為止,一切還只是2d的樣子。不過,maptalks允許我們繪制3維的高度面(立體的線)。只需要引入一個(gè)altitude屬性,并在底圖上引入pitch屬性使視角稍稍偏移, 我們的2.5d地圖就畫出來了。

drawLimitLines(idx, coordinates, properties) {
  const outLine = new maptalks.MultiLineString(coordinates, {
    symbol: {
      lineColor: edgeColor,
      lineWidth: 1,
      textPlacement: "vertex"
    },
    properties: {
      altitude: altitude,
      index: idx,
      id: properties.id,
      properties: properties
    }
  });
  this.limitLines.push(outLine);
},
drawPolygons(idx, coordinates, properties) {
  const polygon = new maptalks.MultiPolygon(coordinates, {
    symbol: {
      lineWidth: 1,
      lineColor: edgeColor,
      polygonFill: polygonColors[0],
      polygonOpacity: 0.5
    },
    properties: {
      altitude: altitude,
      id: properties.id,
      index: idx,
      properties: properties
    }
  })
  .on("mouseenter", function(e) {
    e.target.updateSymbol({
      polygonFill: polygonColors[1]
    });
  })
  .on("mouseout", function(e) {
    e.target.updateSymbol({
      polygonFill: polygonColors[0]
    });
  })
  this.polygons.push(polygon);
},
drawRegion() {
  const self = this
  $.getJSON("guizhou.json", "", function(mapData) {
    const features = mapData.features;
    features.forEach((g, i) => {
      const properties = g.properties;
      const coordinates = g.geometry.coordinates
      self.drawPolygons(i, coordinates, properties)
      const pathCoordinates = g.geometry.type == "MultiPolygon" ? coordinates.map(d => { return d[0] }) : coordinates
      self.drawLimitLines(i, pathCoordinates, properties)
    });
    const polygonsLayer = new maptalks.VectorLayer(
      "vector-polygon",
      self.polygons,
      {
        enableAltitude: true
      }
    ).addTo(self.mapDom);
    const limitLinesLayer = new maptalks.VectorLayer(
      "vector-line",
      self.limitLines,
      {
        enableAltitude: true,
        drawAltitude: {
          polygonFill: edgeColor,
          polygonOpacity: 0.3,
          lineWidth: 0
        }
      }
    ).addTo(self.mapDom);
  })
},

2.數(shù)據(jù)和樣式處理
到這個(gè)時(shí)候,效果還是不太令人滿意??h市間的邊界太丑,有沒有什么辦法把他去掉呢?很簡單,直接繪制地圖的外沿就好。不過,網(wǎng)上下載的貴州省邊界好像和現(xiàn)在帶有區(qū)縣劃分的精度不太一樣?那么,就來自己處理一下吧。根據(jù)問答如何合并區(qū)域邊界,訪問在線的地圖數(shù)據(jù)處理網(wǎng)站http://mapshaper.org/,給每個(gè)縣市取一個(gè)相同的別名,一番輸入輸出,我們就得到了貴州省的外邊界。

drawBorderLines(coordinates, properties) {
    const outLine = new maptalks.MultiLineString(coordinates, {
      symbol: {
        lineColor: edgeColor,
        lineWidth: 1,
        textPlacement: "vertex"
      },
      properties: {
        altitude: altitude,
        id: properties.id,
        properties: properties
      }
    });
    this.limitLines.push(outLine);
},
drawWall() {
    const self = this
    $.getJSON("guizhou-border.json", "", function(borderMapData) {
      const borderFeatures = borderMapData.features[0]
      const properties = borderFeatures.properties;
      const pathCoordinates = borderFeatures.geometry.coordinates.map(d => { return d[0] })
      self.drawBorderLines(pathCoordinates, properties)
      const limitLinesLayer = new maptalks.VectorLayer(
        "vector-line",
        self.limitLines,
        {
          enableAltitude: true,
          drawAltitude: {
            polygonFill: edgeColor,
            polygonOpacity: 0.3,
            lineWidth: 0
          }
        }
      ).addTo(self.mapDom);
    })
}

當(dāng)然,mapshaper的功效不止于此,簡直是區(qū)域數(shù)據(jù)處理的一大利器,非常值得探索。
另一個(gè)令人不太滿意的是地圖的底圖。打開mapbox,找到Studio然后Start With Basic,一個(gè)全新的自配地圖的世界等待著你。這里,就隨便先把英文的區(qū)縣名換成中文好了。

完成配置之后,點(diǎn)擊share,你會(huì)得到一個(gè)鏈接。不過,在用他替換掉Map的urlTemplate之前,還要按照格式進(jìn)行一下修整。

最后,就得到了本文開頭所示的地圖。相關(guān)源碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100333.html

相關(guān)文章

  • vue 地圖可視化 maptalks

    摘要:首先利用搭建一個(gè)項(xiàng)目,然后寫一段的。如果對(duì)項(xiàng)目的創(chuàng)建比較熟悉,可以跳過步驟一,直接看步驟二。輸入保存的模板名字,進(jìn)入項(xiàng)目初始化構(gòu)建,等待構(gòu)建完成。二安裝刪除,新建,輸入如下代碼地圖初始化,應(yīng)寫在函數(shù)中,以保證掛載點(diǎn)先于地圖渲染。 Maptalks 項(xiàng)目是一個(gè) HTML5 的地圖引擎, 基于原生 ES6 Javascript 開發(fā): 二三維一體化地圖, 通過二維地圖的旋轉(zhuǎn) /傾斜增加三維視...

    enali 評(píng)論0 收藏0
  • iChart--地圖顯示人口統(tǒng)計(jì)

    摘要:導(dǎo)語大數(shù)據(jù)呈現(xiàn)應(yīng)用越來越廣泛支持大數(shù)據(jù)呈現(xiàn)的,水平較高的有然而在地圖呈現(xiàn)的功能上,大都只能繪制矢量地圖,而不能呈現(xiàn)具有真實(shí)效果的地圖鑒于此,本文重點(diǎn)在于如何制作一張,即可以看到真實(shí)效果,又能進(jìn)行交互的矢量地圖先睹為快若有所思技術(shù)選擇想實(shí)現(xiàn)上 導(dǎo)語 大數(shù)據(jù)呈現(xiàn)應(yīng)用越來越廣泛,支持大數(shù)據(jù)呈現(xiàn)的SDK,水平較高的有echarts、highchart、D3;然而在地圖呈現(xiàn)的功能上,大都只能繪制...

    mtunique 評(píng)論0 收藏0
  • 三、基于lufylegend引擎魔塔游戲開發(fā)(繪制第一層地圖

    摘要:和代表普通道路和墻,和代表星星和巖漿。用作裁剪接收?qǐng)D片對(duì)象起始坐標(biāo)和裁剪區(qū)域五個(gè)參數(shù)起始坐標(biāo)和裁剪區(qū)域可選用于創(chuàng)建圖像,可以添加到游戲圖層將指定尺寸按照指定行列進(jìn)行裁剪,返回一個(gè)二維數(shù)組生成動(dòng)畫,每一行為一組動(dòng)畫。 繪制地圖前準(zhǔn)備 在繪制之前,我們先看一下地圖的數(shù)據(jù)實(shí)現(xiàn) globalData = { mapCol: 11, mapRow: 11, size: 32, f...

    Wildcard 評(píng)論0 收藏0
  • 入門Leaflet之小Demo

    入門 Leaflet 之小 Demo 寫在前面 ---- WebGIS 開發(fā)基礎(chǔ)之 Leaflet GIS 基本概念:GIS、Map、Layer、Feature、Geometry、Symbol、Data(Point、Polyline、Polygon)、Renderer、Scale、Project、Coordinates; GIS 開發(fā)概述:架構(gòu)模式、常用平臺(tái)和 SDK、二維三維 使用 Lea...

    Eminjannn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<