d3-geo

https://github.com/d3/d3-geo

僅作閱讀理解API文檔時(shí)的參考易茬,如有錯(cuò)誤麻煩指正扭勉,多謝~

Map projections are sometimes implemented as point transformations.
地圖投影有時(shí)會(huì)由點(diǎn)轉(zhuǎn)換實(shí)現(xiàn)剪菱。

This is a reasonable mathematical approach if your geometry consists of continuous, infinite point sets. Yet computers do not have infinite memory, so we must instead work with discrete geometry such as polygons and polylines!
如果你的球面幾何由連續(xù)的無(wú)限點(diǎn)集合組成,這是一個(gè)合理的數(shù)學(xué)方法丧枪。 由于計(jì)算機(jī)沒(méi)有無(wú)限的內(nèi)存潘悼,因此我們必須使用離散的幾何圖形,如多邊形和折線嗤栓!

Discrete geometry makes the challenge of projecting from the sphere to the plane much harder. The edges of a spherical polygon are geodesics (segments of great circles), not straight lines. Projected to the plane, geodesics are curves in all map projections except gnomonic, and thus accurate projection requires interpolation along each arc. D3 uses adaptive sampling inspired by a popular line simplification method to balance accuracy and performance.
使用離散的幾何圖形進(jìn)行球面投影到平面是非常困難的冻河。球形的多邊形的邊緣是測(cè)地線,而不是直線茉帅。投影到平面叨叙,測(cè)地線是所有地圖投影(除了點(diǎn)切投影)的曲線,因此準(zhǔn)確的投影需要沿著每個(gè)弧線進(jìn)行插值堪澎。D3使用自適應(yīng)采樣(受一種流行的線簡(jiǎn)化方法而啟發(fā)得到的)方法來(lái)平衡精準(zhǔn)度和性能擂错。

The projection of polygons and polylines must also deal with the topological differences between the sphere and the plane. Some projections require cutting geometry that crosses the antimeridian, while others require clipping geometry to a great circle. Furthermore, spherical polygons require a winding order convention to determine which side of the polygon is the inside: D3 and TopoJSON use clockwise winding. (Spherical polygons can be larger than a hemisphere! See also ST_ForceRHR in PostGIS.)
多邊形和折線的投影還必須處理球體與平面之間的拓?fù)洳町悺R恍┩队靶枰┻^(guò)對(duì)向子午線切割球體樱蛤,另一些投影需要將球體裁剪成一個(gè)大圓钮呀。此外剑鞍,球形多邊形需要一個(gè)環(huán)繞的順序約定來(lái)決定多邊形的哪邊是內(nèi)側(cè):D3和TopoJSON采用的是順時(shí)針順序。(球面多邊形可以大于半球爽醋!另請(qǐng)參見(jiàn)PostGIS中的ST_ForceRHR蚁署。)

D3’s approach affords great expressiveness: you can choose the right projection, and the right aspect, for your data. D3 supports a wide variety of common and unusual map projections. For more, see Part 2 of The Toolmaker’s Guide.
D3提供了豐富的表現(xiàn)力:您可以為您的數(shù)據(jù)選擇正確的投影和正確的方面。D3提供多種常見(jiàn)和不常見(jiàn)的地圖投影蚂四。有關(guān)更多信息光戈,請(qǐng)參閱 The Toolmarker's Guide的Part2 。

D3 uses GeoJSON to represent geographic features in JavaScript. (See also TopoJSON, an extension of GeoJSON that is significantly more compact and encodes topology.) To convert shapefiles to GeoJSON, use ogr2ogr, part of the GDAL package. In addition to map projections, D3 includes useful spherical shape generators and spherical math utilities.
D3使用GeoJSON來(lái)展示JavaScript中的地理要素遂赠。(另請(qǐng)參閱TopoJSON田度,它是GeoJSON的擴(kuò)展,它大大的壓縮和編碼了拓?fù)洳季纸夥摺#┮獙hapefiles轉(zhuǎn)換為GeoJSON,請(qǐng)使用ogr2ogr乎莉,它是GDAL軟件包的一部分送讲。 除了地圖投影,D3包括有用的球形生成器和球面數(shù)學(xué)實(shí)用工具惋啃。

安裝

<script src="https://d3js.org/d3-array.v1.min.js"></script>
<script src="https://d3js.org/d3-geo.v1.min.js"></script>
<script>
var projection = d3.geoAlbers(), 
    path = d3.geoPath(projection);
</script>

地圖數(shù)據(jù)

如何獲取中國(guó)地圖的 GeoJSON 文件呢哼鬓,真的有點(diǎn)麻煩,可以參照: https://github.com/clemsos/d3-china-map 進(jìn)行制作边灭。

Mark

  • 中國(guó)地圖的 GeoJSON 文件: china.geojson
  • 各縣的JSON地圖文件:mapdata.zip
    解壓縮后有兩個(gè)文件夾和一個(gè) JSON 文件:
    geometryCouties:各市~縣的數(shù)據(jù)
    geometryProvince:各省~市的數(shù)據(jù)
    china.json:中國(guó)~省的數(shù)據(jù)
  • 【 地圖系列 】 世界地圖和主要國(guó)家的 JSON 文件:
    http://www.ourd3js.com/wordpress/668/

API

Paths

地理路徑生成器d3.geoPath類(lèi)似于d3-shape中的形狀生成器:給定GeoJSON幾何結(jié)構(gòu)或特征對(duì)象异希,它生成SVG path數(shù)據(jù)字符串或渲染到Canvas的path。 動(dòng)態(tài)或交互式投影中推薦使用Canvas绒瘦,以提高性能称簿。 Path數(shù)據(jù)可以在投影或變換一起使用,也可用于將平面幾何直接渲染成Canvas或SVG惰帽。

var path = d3.geoPath(projection); //創(chuàng)建一個(gè)新的地理路徑生成器憨降。
path(object); //返回對(duì)象的路徑;
path.area(object) //計(jì)算給定要素的投影面積;
path.bounds(object) //計(jì)算給定要素的投影邊界。
path.centroid(object) //計(jì)算給定要素的投影中心该酗。
path.context(context) //設(shè)置渲染上下文,可設(shè)置canvas的context授药。
path.context() //取得渲染上下文。
path.pointRadius(radius) //設(shè)置點(diǎn)要素的半徑呜魄。
path.pointRadius() //取得點(diǎn)要素的半徑悔叽。
path.projection(projection) //設(shè)置地理投影。
path.projection() //設(shè)置地理投影爵嗅。

Projections(投影)

投影將球形多邊形轉(zhuǎn)換為平面多邊形娇澎。 D3提供了幾類(lèi)標(biāo)準(zhǔn)投影的實(shí)現(xiàn):

var projection = d3.geoMercator();
projection(point) // 投影指定的位置,參數(shù)為經(jīng)緯度[longitude,latitude],獲得指定位置的坐標(biāo)[x,y]。
projection.invert(point) // 為指定的位置反轉(zhuǎn)投影,參數(shù)為[x,y],獲得指定坐標(biāo)的經(jīng)緯度[longitude,latitude]睹晒。
projection.stream(stream) // 包裝指定的流監(jiān)聽(tīng)器九火,投影輸入的幾何圖形赚窃。
projection.clipAngle(angle) //設(shè)置投影的裁剪圓半徑,指定角度并返回投影岔激。如果角度為null勒极,切換到子午線切割,而不是小圈的裁剪虑鼎。
projection.clipAngle() //返回當(dāng)前裁剪的角度辱匿,默認(rèn)為空。小圈裁剪是獨(dú)立于通過(guò)clipExtent的視窗裁剪炫彩。
projection.clipExtent(extent) // 設(shè)置投影的剪輯視窗范圍為指定的邊界(以像素為單位)匾七。extent 范圍邊界被指定為一個(gè)數(shù)組[[x0, y0], [x1,y1]],其中x0 是視窗的左側(cè)江兢,y0 是頂部昨忆,x1 為右側(cè)和y1 是底部。如果范圍為null杉允,則視窗裁剪不執(zhí)行邑贴。
projection.clipExtent() // 返回當(dāng)前視窗裁剪的范圍,默認(rèn)為null叔磷。視窗裁剪是獨(dú)立于通過(guò)clipAngle的小圈剪裁拢驾。
projection.scale(scale) // 設(shè)置投影的比例尺為特定的值,并返回投影改基。
projection.scale() // 返回投影的比例尺繁疤。
projection.translate(point) // 如果point 點(diǎn)指定了,則設(shè)置投影轉(zhuǎn)變的位移為指定的二元數(shù)組[x, y]并返回的投影秕狰。如果未指定點(diǎn)稠腊,則返回當(dāng)前變換的位移,默認(rèn)為[480, 250]鸣哀。變換的位移確定投影的中心像素坐標(biāo)麻养。默認(rèn)轉(zhuǎn)換位移的位置是?0°,0°?,在一個(gè)960×500區(qū)域的中心诺舔。
projection.center(location) //如果center 重心指定了鳖昌,則設(shè)置投影中心為指定的位置,經(jīng)度和緯度度數(shù)的兩元數(shù)組低飒,并返回投影许昨。如果沒(méi)有指定中心,則返回當(dāng)前的中心褥赊,默認(rèn)為?0°,0°?糕档。
projection.rotate(rotation) // 如果rotation 旋轉(zhuǎn)指定了,設(shè)置投影的三軸旋轉(zhuǎn)為指定的角度λ,φ和γ(偏航角速那,傾斜角和滾動(dòng)角俐银,或等效地經(jīng)度,緯度和滾動(dòng))端仰,以度并返回投影捶惜。如果rotation 未指定,返回當(dāng)前缺省的轉(zhuǎn)動(dòng)值[0, 0, 0]荔烧。如果rotation 指定且只有兩個(gè)值吱七,而不是3個(gè)值,那么滾動(dòng)的角度被假設(shè)為0°鹤竭。
projection.precision(precision) // 如果precision 精度指定了踊餐,則設(shè)置投影自適應(yīng)重采樣的臨界值為指定的值,以像素為單位臀稚,并返回投影吝岭。此值對(duì)應(yīng)于Douglas–Peucker 距離。如果precision 精度沒(méi)有指定吧寺,則返回投影當(dāng)前重采樣的精度窜管,其精度默認(rèn)為Math.SQRT(1/2)。0的精密度禁止自適應(yīng)重采樣撮执。
projection.fitExtend(extend,object) // 設(shè)置給定范圍,對(duì)投影進(jìn)行縮放和平移舷丹,以適合給定的范圍并居中抒钱。 范圍指定為數(shù)組[[x 0,y 0]颜凯,[x 1谋币,y 1]],其中x 0是邊界框的左邊症概,y 0是頂部蕾额,x 1是右邊,y 1是底部彼城。 返回投影诅蝶。
projection.fitSize(size,object) // fitExtend的簡(jiǎn)單寫(xiě)法,左上角為[0,0]募壕。

antimeridian cutting:http://bl.ocks.org/mbostock/3788999

示例

<!doctype html>
<html>
<head>    
<meta charset="utf-8">   
 <title></title>   
 <style>        
body{   background: #21395b;        }    
</style>
</head>
<body>
<svg></svg>
<script src="/bower_components/d3/d3.js"></script>
<script> 
   var width = 1300; 
   var height = 1000;  
   var padding = 20;
   var g = d3.select('svg')
           .attr('width',width) 
           .attr('height',height) 
           .append('g'); 
   var root; 
   var projection,path;
   function color(i) {  return '#0e2338';    } 

   d3.json('china.json',function (data) { 
       root = data; 
       //設(shè)置投影 
       projection = d3.geoMercator()
       projection.fitExtent([[padding,padding],[width-padding*2,height-padding*2]],root);
       //projection.fitSize([width,height],root);
       //生成地理路徑
       path = d3.geoPath(projection);
       update();
   }); 

   function update() { 
       g.selectAll("path") 
               .data(root.features)
               .enter() 
               .append("path")
               .attr("stroke","#234060") 
               .attr("stroke-width",1)
               .attr("fill", function(d,i){ 
                   return color(i);  
               })
              .attr("d", path )   //使用地理路徑生成器
              .on("mouseover",function(d,i){
                    d3.select(this) 
                           .attr("fill","green");  
              }) 
              .on("mouseout",function(d,i){ 
                   d3.select(this)
                            .attr("fill",color(i));  
              }); 
       g.selectAll("text") 
               .data(root.features)
               .enter()
               .append("text")
               .attr("text-anchor","middle") 
               .attr("dy",".3em") 
               .attr("fill", "#eee") 
               .style("font-size", "10px") 
               .text(function (d) { 
                   return d.properties.name; 
               })
               .attr("transform", function (d) { 
                   return "translate("+projection(d.properties.cp).join(',')+")"; 
               }); 
   }
</script>
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末调炬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舱馅,更是在濱河造成了極大的恐慌缰泡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件代嗤,死亡現(xiàn)場(chǎng)離奇詭異棘钞,居然都是意外死亡缠借,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)宜猜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泼返,“玉大人,你說(shuō)我怎么就攤上這事宝恶》叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵垫毙,是天一觀的道長(zhǎng)霹疫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)综芥,這世上最難降的妖魔是什么丽蝎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮膀藐,結(jié)果婚禮上屠阻,老公的妹妹穿的比我還像新娘。我一直安慰自己额各,他們只是感情好国觉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著虾啦,像睡著了一般麻诀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上傲醉,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天蝇闭,我揣著相機(jī)與錄音,去河邊找鬼硬毕。 笑死呻引,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吐咳。 我是一名探鬼主播逻悠,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼韭脊!你這毒婦竟也來(lái)了蹂风?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乾蓬,失蹤者是張志新(化名)和其女友劉穎惠啄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撵渡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年融柬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趋距。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粒氧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出节腐,到底是詐尸還是另有隱情外盯,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布翼雀,位于F島的核電站饱苟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狼渊。R本人自食惡果不足惜箱熬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狈邑。 院中可真熱鬧城须,春花似錦、人聲如沸米苹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蘸嘶。三九已至良瞧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亏较,已是汗流浹背莺褒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工掩缓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雪情,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓你辣,卻偏偏與公主長(zhǎng)得像巡通,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舍哄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 兒子:“媽媽我作業(yè)寫(xiě)玩了可以出去玩嗎宴凉?” 媽媽不可置信的說(shuō):“你都寫(xiě)完了?我看看” 檢查后媽媽說(shuō):“語(yǔ)文的練習(xí)資料...
    何金霖閱讀 143評(píng)論 0 0
  • 讓心靈寧?kù)o根本不是佛教的目的表悬。佛教的目的是了解實(shí)相弥锄。這才是最重要的。一個(gè)佛教老師寧可你有一個(gè)動(dòng)蕩但看到實(shí)相的心,而...
    Zhenzen閱讀 279評(píng)論 0 0
  • 晨昏里 顛倒里 影子說(shuō) 他知道 所有秘密 往昔里 歲月里 影子說(shuō) 沒(méi)忘記 所有回憶 未來(lái)里 我們里 原來(lái)只剩 我自...
    云低月垂閱讀 202評(píng)論 0 1
  • 張恨水的《秦淮世家》是我偶然在圖書(shū)館閑逛的時(shí)候遇到的籽暇,以前則從沒(méi)有接觸過(guò)張恨水的作品温治,我之所以選擇看它最初也是為了...
    涼之閱讀 726評(píng)論 0 0
  • 我喜歡聽(tīng)故事熬荆,尤其是行走在山山水水之間,聽(tīng)諳熟此地的人娓娓道來(lái)一個(gè)關(guān)乎腳下這方土地的浪漫傳奇绸狐,這山卤恳,這水,這我不曾...
    濯明月于漣漪閱讀 408評(píng)論 3 7