最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Canvas中繪制Geojson數(shù)據(jù)示例詳解

 更新時間:2022年11月17日 09:54:58   作者:uccs  
這篇文章主要為大家介紹了Canvas中繪制Geojson數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

需求分析

在做地圖開發(fā)的時候遇到一個需求,是在 canvas 中繪制 Geojson 數(shù)據(jù)

數(shù)據(jù)格式為 EPSG:4326Polygon

  • 三維數(shù)組
  • 每一項都是由經(jīng)緯度組成的
  • 第一個點和最后一個點相同,表示 Polygon 是閉合的
[
  [
    [109.54420471485196, 35.76192112844663],
    [109.54423617129702, 35.76132766033574],
    [109.54539219590997, 35.76155739029704],
    [109.54521918540507, 35.76241249100947],
    [109.54420471485196, 35.76192112844663],
  ],
];

需求分析:

  • 顯示在 canvas 的中間
  • 地圖 y 軸和屏幕的 y 軸是相反的,繪制出來的 Polygon 不能和實際反過來
    • 屏幕的原點在左上角,地圖的原點在左下角

數(shù)據(jù)處理

widthheightcanvas 的寬高

將經(jīng)度和緯度單獨拆分出來

const getLongitudesAndLatitudes = (coordinates: number[][][]) => {
  return coordinates[0].reduce(
    (pre, cur) => {
      pre.longitudes.push(cur[0]);
      pre.latitudes.push(cur[1]);
      return pre;
    },
    { longitudes: [] as number[], latitudes: [] as number[] }
  );
};

得到的結(jié)果是:

const longitudes = [
  109.54420471485196, 109.54423617129702, 109.54539219590997,
  109.54521918540507, 109.54420471485196,
];
const latitudes = [
  35.76192112844663, 35.76132766033574, 35.76155739029704, 35.76241249100947,
  35.76192112844663,
];

計算縮放比例

width / (Math.max(longitudes) - Math.min(longitudes)) 的作用計算 Polygonx 軸縮放比例 xScale = 67369.49567346855

height 同理,計算出 y 軸的縮放比例 yScale = 12905.23981205731

總的縮放比例 scale 采用 xScaleyScale 誰小用誰,為 scale = 12905.23981205731,因為用小的縮放比例,才能在有限的空間下顯示全

const calcScale = ({
  longitudes,
  latitudes,
}: {
  longitudes: number[];
  latitudes: number[];
}) => {
  const xScale =
    width / Math.abs(Math.max(...longitudes) - Math.min(...longitudes));
  const yScale =
    height / Math.abs(Math.max(...latitudes) - Math.min(...latitudes));
  return xScale < yScale ? xScale : yScale;
};

計算偏移度

(Math.max(longitudes) - Math.min(longitudes)) * scale 作用是將經(jīng)度按照 scale 進行縮放,緯度也是同理

在用 widthheight 去減,分別得到要 x 軸和 y 軸需要偏移的空間

這些空間要分布在兩邊,也就是說要分布 Polygon的周圍,所以左后需要除 2,最終得到 xOffset = 32.33763608704606,yOffset = -8.881784197001252e-16

const calcOffset = (
  { longitudes, latitudes }: { longitudes: number[]; latitudes: number[] },
  scale: number
) => {
  const xOffset =
    (width -
      Math.abs(Math.max(...longitudes) - Math.min(...longitudes)) * scale) /
    2;
  const yOffset =
    (height -
      Math.abs(Math.max(...latitudes) - Math.min(...latitudes)) * scale) /
    2;
  return { xOffset, yOffset };
};

將 Coordinates 進行縮放

coordinates 縮放一共分為 3

比較難理解的是第一步,為什么要將每個點去減它的最小值 item[0] - Math.min(...longitudes)

這樣做的目的是為了那個點無限接近于原點,接近原點后,再通過乘以縮放比例和加上偏移度,得到最終的的縮放值

在需求分析時說了,屏幕的原點在左上角,地圖的原點在左下角,所以 y 軸是剛好是相反,y 軸就用 Math.max(...latitudes) - item[1]

const scaleCoordinates = (
  coordinates: number[][][],
  scale: number,
  offset: ReturnType<typeof calcOffset>,
  { longitudes, latitudes }: { longitudes: number[]; latitudes: number[] }
) => {
  return coordinates[0]
    .map((item) => {
      item[0] = item[0] - Math.min(...longitudes);
      item[1] = Math.max(...latitudes) - item[1];
      return item;
    })
    .map((item) => {
      item[0] = item[0] * scale;
      item[1] = item[1] * scale;
      return item;
    })
    .map((item) => {
      item[0] = item[0] + offset.xOffset;
      item[1] = item[1] + offset.yOffset;
      return item;
    });
};

使用 Canvas 進行繪制

const canvas = document.getElementById("canvas");
if (!canvas.getContext) return;
const ctx = canvas!.getContext("2d")!;
ctx.fillStyle = "rgba(32, 210, 255, 0.3)";
ctx.strokeStyle = "rgba(32, 210, 255, 1)";
ctx.beginPath();
ctx.moveTo(coordinates[0][0], coordinates[0][1]);
for (let i = 1; i < coordinates.length; i++) {
  ctx.lineTo(coordinates[i][0], coordinates[i][1]);
}
ctx.closePath();
ctx.stroke();
ctx.fill();

存在問題

無法區(qū)分 Polygon 大小,所以這個方案適用于繪制縮略圖

以上就是Canvas中繪制Geojson數(shù)據(jù)示例詳解的詳細內(nèi)容,更多關(guān)于Canvas繪制Geojson數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JS是按值傳遞還是按引用傳遞

    JS是按值傳遞還是按引用傳遞

    在分析這個問題之前,我們需了解什么是按值傳遞(call by value),什么是按引用傳遞(call by reference)。在計算機科學里,這個部分叫求值策略(Evaluation Strategy)。它決定變量之間、函數(shù)調(diào)用時實參和形參之間值是如何傳遞的。
    2015-01-01
  • javascript實現(xiàn)的鼠標鏈接提示效果生成器代碼

    javascript實現(xiàn)的鼠標鏈接提示效果生成器代碼

    javascript實現(xiàn)的鼠標鏈接提示效果生成器代碼...
    2007-06-06
  • JS動態(tài)增刪表格行的方法

    JS動態(tài)增刪表格行的方法

    這篇文章主要介紹了JS動態(tài)增刪表格行的方法,涉及JavaScript針對表格元素動態(tài)操作相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-03-03
  • 小程序?qū)崿F(xiàn)分類頁

    小程序?qū)崿F(xiàn)分類頁

    這篇文章主要為大家詳細介紹了小程序?qū)崿F(xiàn)好看的分類頁,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • JavaScript中Dom操作實例詳解

    JavaScript中Dom操作實例詳解

    這篇文章主要介紹了JavaScript中Dom操作,結(jié)合實例形式詳細分析了javascript針對dom元素節(jié)點增刪改查相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2019-07-07
  • VS2008中使用JavaScript調(diào)用WebServices

    VS2008中使用JavaScript調(diào)用WebServices

    這篇文章主要介紹了VS2008中使用JavaScript調(diào)用WebServices,需要的朋友可以參考下
    2014-12-12
  • js字符串截取指定字符前面/后面的字符串代碼

    js字符串截取指定字符前面/后面的字符串代碼

    在頁面數(shù)據(jù)處理的過程中都會不可避免的使用字符串的截取操作,下面這篇文章主要給大家介紹了關(guān)于js字符串截取指定字符前面/后面的字符串,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • 原生js實現(xiàn)移動端Touch輪播圖的方法步驟

    原生js實現(xiàn)移動端Touch輪播圖的方法步驟

    這篇文章主要介紹了原生js實現(xiàn)移動端Touch輪播圖的方法步驟,touch輪播圖其實就是通過手指的滑動,來左右切換輪播圖,touch輪播圖其實就是通過手指的滑動,來左右切換輪播圖,
    2019-01-01
  • js 深拷貝函數(shù)

    js 深拷貝函數(shù)

    Javascript中的對像賦值與Java中是一樣的,都為引用傳遞.就是說,在把一個對像賦值給一個變量時,那么這個變量所指向的仍就是原來對像的地址.那怎么來做呢 答案是克隆.
    2008-12-12
  • 精通Javascript系列之Javascript基礎(chǔ)篇

    精通Javascript系列之Javascript基礎(chǔ)篇

    javascrpit的基本概念分析,剛開始學習js的朋友可以參考下。
    2011-06-06

最新評論

砚山县| 石棉县| 平武县| 鄂伦春自治旗| 长兴县| 慈溪市| 扎赉特旗| 竹北市| 寻乌县| 莱阳市| 伊宁市| 云梦县| 广水市| 厦门市| 吉木萨尔县| 龙岩市| 巴林左旗| 金坛市| 扎赉特旗| 射阳县| 武定县| 沾化县| 马公市| 漳浦县| 连南| 新平| 哈尔滨市| 福清市| 道真| 顺平县| 福建省| 虎林市| 渝北区| 监利县| 花垣县| 凤冈县| 永仁县| 汝州市| 随州市| 特克斯县| 岳普湖县|