在現在很多的應用系統中,會提供一個地圖模塊,地圖相關的應用和app也是非常多,最廣泛的應用就屬于導航,地圖基本上分在線的和離線的兩種,在線的一般都是實時的,數據也是最新的,速度很快路線很準,缺點是耗費流量,一直需要收發數據,而離線的需要先把地圖包和對應的文件下載到本地,直接讀取本地的地圖數據進行交互。
用Qt做過很多個商業項目,其中有幾個涉及到加載地圖用于展示設備的分布,之前做的是在線的地圖,通過網頁的交互來獲取和設置數據,最近幾年越來越多需要離線地圖的需求,離線地圖最核心的就是地圖數據包,也叫瓦片地圖,需要通過下載器下載到本地使用,網上查了下,還非常多公司專門做這個離線瓦片地圖的下載器,絕大部分都是收費的。
越來越多的地圖服務用到瓦片技術,例如我國實行發布的天地圖服務就運用了地圖瓦片技術。其實切片之后的地圖瓦片是柵格圖像,并不具備定位信息,不過切片運用了相關切片算法之后,可以計算出具體定位的位置。例如采用WGS84大地坐標系為空間參考,對地圖進行切片,采用一定的切片算法,例如用經緯度步長等比例分割形成地圖瓦片,當需要對一個具體地方進行定位時,可以根據經緯度步長來計算具體位置,以此來達到定位的功能。
近期抽空特意將大屏系統中常用的區域地圖以及地圖功能模塊重新封裝了下,使得支持在線和離線兩種模式,同時支持webkit、webengine、ie 三種方式,支持閃爍點圖、遷徙圖、區域地圖、儀表盤,還帶有交互功能。
echart儀表盤帶交互demo開源地址:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo) [https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)
文件名稱:echartgauge
體驗地址:[https://gitee.com/feiyangqingyun/QWidgetExe](https://gitee.com/feiyangqingyun/QWidgetExe) [https://github.com/feiyangqingyun/QWidgetExe](https://github.com/feiyangqingyun/QWidgetExe)
文件名稱:bin_map.zip
### Echarts地圖封裝類功能特點
1. 同時支持閃爍點圖、遷徙圖、區域地圖、儀表盤等。
2. 可以設置標題、提示信息、背景顏色、文字顏色、線條顏色、區域顏色等各種顏色。
3. 可設置城市的名稱、值、經緯度 集合。
4. 可設置地圖的放大倍數、是否允許鼠標滾輪縮放。
5. 內置世界地圖、全國地圖、省份地圖、地區地圖,可以精確到縣,所有地圖全部離線使用。
6. 內置了各省市json數據文件轉js文件功能,如有數據更新自行轉換即可,支持單個文件轉換和一鍵轉換所有文件。
7. 內置了從json文件或者js文件獲取該區域的所有名稱和經緯度信息集合的功能,可以通過該方法獲取到信息用來顯示。
8. 依賴瀏覽器組件顯示地圖,提供的demo支持webkit、webengine、ie 三種方式加載網頁。
9. 拓展性極強,可以依葫蘆畫瓢自行增加各種精美的echarts組件,做出牛逼的效果。
10. 內置的儀表盤組件提供交互功能,demo演示中包含了對應的代碼。
11. 函數接口友好和統一,使用簡單方便,就一個類。
12. 支持任意Qt版本、任意系統、任意編譯器。
### 百度地圖封裝類功能特點
特別說明:從2019年6月份開始官方對部分功能開始收費比如主題樣式、查詢路線等,需要自行去后臺充值后對應的秘鑰才能使用。
1. 同時支持在線地圖和離線地圖兩種模式。
2. 同時支持webkit內核、webengine內核、IE內核。
3. 支持設置多個標注點,信息包括名稱、地址、經緯度。
4. 可設置地圖是否可單擊、拖動、鼠標滾輪縮放。
5. 可設置協議版本、秘鑰、主題樣式、中心坐標、中心城市、地理編碼位置等。
6. 可設置地圖縮放比例和級別,縮略圖、比例尺、路況信息等控件的可見。
7. 支持地圖交互,比如鼠標按下獲取對應位置的經緯度。
8. 支持查詢路線,可設置起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。
9. 可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。
10. 可設置行政區劃,指定某個城市區域繪制圖層,在線地圖自動輸出行政區劃邊界點集合到js文件給離線地圖使用。
11. 可添加多個覆蓋物。支持點、折線、多邊形、矩形、圓形、弧線、點聚合等。
12. 函數接口友好和統一,使用簡單方便,就一個類。
13. 支持任意Qt版本、任意系統、任意編譯器。
文轉載自公眾號“把科學帶回家”(ID:steamforkids)
每天刷牙的時候,你有沒有想過彩條牙膏的彩條怎么來的?為什么不同顏色的彩條在牙膏管子里不會混在一起?
其實,如今的彩條牙膏在管子里的樣子和擠出來的樣子差不多。你可以切開一個看看。切開的牙膏是這樣的:
如果把彩條牙膏凍住,然后剪開包裝,就是這樣的:
那么彩條牙膏是怎么制作的呢?
在工廠里的時候,機器把不同顏色的彩條分別裝到一個中間有隔板的管子里,不同顏色的彩條被隔板隔開。接著就像做冰淇淋那樣,機器把所有彩條一起打到牙膏管子里。
彩條牙膏的制作
那么問題就來了,不同顏色的彩條在牙膏里怎么不會混合在一起,尤其是在被擠了很多次以后?
這要分成靜止狀態和擠牙膏2個情況討論。
靜止的牙膏里的彩條不變色,主要是因為2個因素——牙膏的流體物理性質以及彩條所用的色素。
牙膏是一種賓漢流體(bingham plastic),屬于非牛頓流體。除了牙膏,血液、酸奶、蛋黃醬都是賓漢流體。
保齡球在神奇的非牛頓流體上彈彈彈。非牛頓流體看著像水,但卻比水“結實”。
賓漢流體的一個超強屬性就是,在不受力,比如沒有被擠壓的情況下,它可以像固體一樣基本不流動。而受到了一定程度的擠壓后,賓漢流體才能開始流動。
因此當牙膏沒有被你擠的時候,彩條能保持比較稠密的狀態,比較接近不能流動的固體,可以在牙膏管里互不干擾。
另外,在一般情況下,不同顏色的染料會發生滲色(bleeding)的現象。彩條牙膏的生產廠家為了防止彩條互相滲色,常用聚乙烯包裹染料,使它們變得穩定。
這就是靜止的牙膏彩條不會混合的兩大原因。
紅色和藍色是常用的彩條顏色
那么在擠牙膏的時候,為什么不同顏色的彩條不會混合呢?
剛才說到牙膏是一種賓漢流體。當你在擠牙膏的時候,彩條就會流動起來,變得更像液體而不是固體,這樣它們才能從牙膏管子里流出。
當牙膏流動的時候,它就必須要符合一個可怕的流體力學規律——雷諾數(Reynolds number)。
雷諾數的計算公式,開不開心,驚不驚嚇?
計算雷諾數的這個公式看看就好了,反正我們以后不考。它的意思是,一種流體的粘度(viscosity)越大,它的雷諾數就越小;反之粘度越小,雷諾數就越大。
粘度低(左)和粘度高(右)的液體
那么雷諾數高或者低又有什么影響呢?
雷諾數決定了液體是怎樣流動的。
具體來說,如果雷諾數小于2100,那么液體將這樣流動:
層流
這種流動叫做層流(laminar flow),層流的液體平行運動,不會攪和在一起。
如果雷諾數大于4000,那么液體將這樣流動:
湍流
這種流動叫做湍流(turbulent flow),看圖就知道,湍流的液體互相混合。
上面2個是層流,下面2個是湍流
對于牙膏來說,它的粘度非常大,因此它的流動只能是層流。擠牙膏的時候,位于邊緣的彩條和中間的白條一起平行流出,所以擠出來的牙膏彩條也不會混合在一起。
當然了,牙膏和粘度較小的水混合后,雷諾數蹭蹭上漲,所以彩條的顏色就會混在一起,水乳交融了。
最后,因為不同顏色的彩條有相同的流速(它們的流變學性質相同),因此可以保證擠到最后也不會出現某種彩條被首先擠完的情況。
不過,當彩條牙膏剛剛誕生的時候,可不是現在這個樣子。
歷史上最早的彩條牙膏管子設計,和現在的彩條牙膏很不一樣
在最早的彩條牙膏管子里,彩條被分別牙膏管里的不同位置。這個設計是在1955年出現的,它的發明人是個叫做 Leonard Lawrence Marraffino 的美國人。一開始 Marraffino 想設計的是一種帶斑點的牙膏,沒想到意外設計出了彩條牙膏。
在這種彩條牙膏里,兩種不同顏色的彩條并不是被組合好再打到牙膏管子里的。
實際上,紅色的彩條被放在靠近牙膏管子開口的地方。白色的彩條比較多,它被放在在靠后的位置。牙膏口子向內延伸了一段,這一段上面有幾個狹長的縫,紅色彩條就是從這里流出來,然后和白色彩條匯合的。
那么怎么保證擠到最后還有2種顏色的彩條呢?
這是因為在這種牙膏里,紅色彩條和白色彩條的粘度不同,紅色彩條的粘度比較小,所以它更加順滑,流得比較快。白色彩條的粘度更大,流得更慢。
這兩種不同粘度的彩條搭配以后,就能保證直到最后一滴,擠出來的牙膏都有兩種顏色。
不過,這種設計的銷量并不好,后來逐漸被更加簡單的設計,也就是我們現在使用的彩條牙膏替代了。
圖片來源:Groundwater Dictionary, wikipedia, ScienceAlert,nP-dog's blog, Business Insider, giphy, imgur
參考資料:
https://www.gsk.com/en-gb/behind-the-science/patients-consumers/science-of-a-different-stripe/
https://bashny.net/t/en/91030
https://www.sciencesetavenir.fr/fondamental/70-ans-de-sciences-et-avenir-le-secret-du-dentifrice-a-rayures_116813
https://www.youtube.com/watch?v=RVZ6mUffJgw
https://www.britannica.com/science/laminar-flow
https://www.archtoolbox.com/materials-systems/hvac/laminarflowvsturbulentflow.html
http://www.russochemie.ru/upload/iblock/documents/Brochure%20Cosmetic%20Dispersions.pdf
http://www.sensient-cosmetics.com/pageLibre000105e3.aspx
http://ijppsjournal.com/Vol3Suppl3/2152.pdf
來源:把科學帶回家
編輯:重光
近期熱門文章Top10
↓ 點擊標題即可查看 ↓
1. 我家在地震帶上,你家呢?
2. 自然常數e到底自然在哪?
3. 華為的5G技術,源于這種數學方法
4. 為什么在跑道上要沿逆時針方向跑步?| No.155
5. 蒼蠅落在食物上會發生什么?讓我們說的仔細一點
6. 仙童傳奇
7. 90后學術論文致謝自救指南
8. 你看的每一篇Nature論文,都是這樣出爐的!
9. 硬核預警:量子力學的九種形式
10. 為什么手指能滑動手機屏幕,手指甲卻不能?| No.156
分享成果,隨喜正能量】我們不良的行為、不善的念頭、不好的言語,都屬于我們內心的暴力,要想獲得平和,我們需要自我修習,學會控制情緒,學會內觀反省并接近善良。。
《VBA信息獲取與處理》教程是我推出第六套教程,目前已經是第一版修訂了。這套教程定位于最高級,是學完初級,中級后的教程。這部教程給大家講解的內容有:跨應用程序信息獲得、隨機信息的利用、電子郵件的發送、VBA互聯網數據抓取、VBA延時操作,剪貼板應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數等等內容。程序文件通過32位和64位兩種OFFICE系統測試。是非常抽象的,更具研究的價值。
教程共兩冊,八十四講。今日的內容是專題九“利用IE抓取網絡數據”:IE法提取網頁數據
為了獲取網頁的數據,我們可以通過創建IE控件或webbrowser控件,結合htmlfile對象的方法和屬性,模擬瀏覽器操作,獲取瀏覽器頁面的數據。
這種方法可以模擬大部分的瀏覽器操作。瀏覽器能看到的數據就能用代碼獲取,但是有個致命的缺點:除去各種彈窗相當煩人外,兼容性也確實是個很傷腦筋的問題。在我自己的實踐中感覺這種方法不是很穩定(僅僅是感覺)。
我們在實際工作中遇到網站和網頁相關問題,例如:如何下載網頁數據?網頁之間的通訊是怎么實現的、它們能不能被控制等等。如果你是用VB/VBA/腳本或其它支持自動化對象(AUTOMATION)的語言編程,有一個值得了解的方法是掌握對象模型:將網頁視為對象來控制,這個方法需要了解的是IE的自動化對象(InternetExplorer.Application)或IE控件(Microsoft Internet Controls),以及標準的文檔對象模型(Document)。相關的知識我在前兩個專題中做了大量的講解,這里就不再詳細的說明了。
我給出下面的代碼:
Set ie=CreateObject("InternetExplorer.Application") ’創建對象
ie.Visible=True ’使IE頁面可見,做完這一步,在VBA之外可以看到一個新的IE
ie.navigate "about:blank" ’建立一個空白頁
上面這幾行代碼的作用是創建一個IE應用程序對象,并打開一個空白的網頁。這個網頁獨立于VBA的應用程序(WORD或EXCEL)之外,事實上,你必須自已關掉它,或者用ie.Quit下令退出——注意一下,單純的關閉VBA或SET ie=nothing是不會退出這個網頁的。我們經常用的是將第3行的字符串替換成一個網站的名字,或者替換成一個你主機中的文檔名,也可以是一個圖片名,都是可以的。和你在IE地址欄輸入名稱瀏覽這些文檔是一樣效果。
如果僅僅是創建了一個空的模型是沒有任何利用的價值的,我們需要真正的網頁,這時就需要我們在VBA的應用程序外打開一個完整的網頁了,直到網頁完全加載我們的操作才能向下進行。
我們修正一下上面的那段打開空網頁的代碼:
Sub mynz()
Set ie=CreateObject("InternetExplorer.Application") ’創建對象
ie.Visible=True ’使IE頁面可見,做完這一步,在VBA之外可以看到一個新的IE
ie.navigate " https://baijiahao.baidu.com" ’建立一個空白頁
Do Until .ReadyState=4 '檢查網頁是否加載完畢(4表示完全加載)
DoEvents ‘循環中交回工作權限給系統,以免“軟死機”
Loop
End sub
在上面的代碼中增加了幾行:
Do Until .ReadyState=4 '檢查網頁是否加載完畢(4表示完全加載)
DoEvents ‘循環中交回工作權限給系統,以免“軟死機”
Loop
這幾行代碼可以保證網頁的加載完成,這是根據ie.ReadyState的返回值來判斷的。
readyState一共有5中狀態:
狀態 含義 說明
0 未初始化 對象已建立,但是尚未初始化(尚未調用open方法)
1 初始化 對象已建立,尚未調用send方法
2 發送數據 send()方法已調用,但是當前的狀態及http頭未知
3 數據傳送中 已接收部分數據,因為響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤
4 數據接收完畢 此時可以通過通過responseBody和responseText獲取完整的回應數據
通過以上的分析,我們可以看出,只用當.ReadyState=4時網頁的數據才是有效的數據。
當網頁加載完畢,剩下的工作就是從網頁中抓取數據了,數據的抓取主要是利用控件對象的屬性和方法。
1)用Set doc=ie.Document 取得網頁的文檔對象
從文檔對象(Document)以下展開的對象模型,它代表網頁的內容,和前面那個IE的應用程序不是同一個體系.
Documnet(文檔)是文檔對象模型,相當于OFFICE對象中的APPLICATION,取得Document之后,不論修改網頁還是讀寫網頁,還是觸發事件,一切都好說,每個URL都對應有一個Documnet(這是假如定成功導航Navigate到那個URL完成,因此之前要求確定IE對象READSTATE,以確定對應URL的Document打開了)
2) 在Documnet之下可以取得documentElement和body兩個節點。
可以用下面的語句:
set xbody=doc.Body ‘取得body對象
set xDoc=doc. documentElement ‘取得根節點
body前面已經說過,相當于標記的對象,根節點相當于網頁中的標記元素的對象,MHTML的類型庫定義里,它們都屬于HTMLHtmlElement類型的對象,下面我把這種類型的對象稱為一個“節點”,不過要注意的是文檔對象不是節點對象,它是HTMLDocument類型。根節點和body節點不同的是根節點包括整個網頁,在HTML的文檔對象模型中,這類對象有幾種屬性可以取得其中的內容:
對象.innerHtml ‘對象內部的HTML文本
對象.OuterHtml ‘對象中的HTML文本,包括對象本身的HTML標記在內
對象.innerText ‘對象內部的TEXT,不包括HTML標記
對象.OuterText ‘同上,包括對象本身的文本
所以,如果我們要抓取某個網站的所有HTML內容,代碼可以這樣寫:
set doc=ie.Document
set xDoc=doc. documentElement ‘取得根節點
strX=xDoc.OuterHtml ‘取得所有的HTML內容
3) 每一個標記節點對象之下都有一個名為ChildNodes的集合,它包含了“直屬于本節點下的標記”,就象是文件目錄,根目錄下的子目錄.
我們可以看到:HTML標記是文檔的根節點,是Document的Childnodes集合中的一個成員(Document不是節點,是另一種類型對象,上一級文檔,但它可以有下級節點集合,正如磁盤可以有下級目錄,但它本身不是目錄),BODY是根節點的ChildNodes集合中的一個成員,而DIV和P兩個節點則是BODY的ChildNodes集合中的兩個成員,同樣也有自己的Childnoes集合。
我們要注意:文檔對象模型中,集合與OFFICE的集合有所不同,集合是從0開始計數的,計數屬性是Length而不是Count。
4)除了ChildNodes集合,大家在網頁文檔對象中還常見到的就是很大氣的一種集合:All集合,這是“最糊涂”的一種集合,文檔和各級節點都帶有這個集合,正如這個名字所示,它是不分層次的,但用起來也很方便:
Set doc=ie.Document
Set xCols=doc.All ’取得文檔中的所有節點集合
Set xbCols=doc.body.All ’取得body節點下所有的節點集合
雖然任何標記節點都有ALL集合,但我們還是喜歡用DOCUMENT的ALL,原因無它,文檔最大,一鍋燴的ALL找起來也最合適。ALL查找是有條件的:如果這個標記沒有ID,你無法查到它的名字。
不過,ALL集合有一個很方便的特性:ID可以掛到ALL集合之下:
strX=doc.All.mytag.innerhtml
5)獲得文檔對象的getElementsByName集合,可以利用下面的方法:
set mydivs=doc. getElementsByName(“div”) ‘取得所有DIV標記,注意還是集合
6) 文檔對象的FORMS集合,因為大部分網頁的數據提交都是通過FORM標記提交的:
Set myForms=doc.Forms ’取得所有的FORM標記
Set frmX=myForms.item(0) ’第1個FORM
FORM標記節點代表的對象是很多朋友關心的內容——在網頁對象中,它可以發送數據到服務器,使服務器刷新網頁(實際上是服務器按某個格式約定發回數據),我們可以把網頁的FORM看成是一個遠程的函數調用接口,FORM標記中的ACTION指向的URL地址就是函數入口,而FORM標記內的各個INPUT標記節點就是函數的參數,當發出FORM.Submit方法時,就是遠程調用函數了,在服務器端,諸如ASP,PHP就是老老實實找FORM的參數,不管你是用GET還是POST:
frmX.submit ’相當于用戶在頁面上按下FORM的發送按鍵
上面我羅列了獲取網頁數據的一般的方法,并沒有什么特別的使用要求,大家可以根據自己的習慣來利用,這個專題之后的內容就是靈活運用這些知識點來解決實際問題了。
本節知識點回向:
如何提交表單?如何下載圖片的地址?如何獲得表的數據?
【分享成果,隨喜正能量】得意之時淡然,失意之時坦然,順風順水的時候需要一種內斂和沉穩,遭遇逆境和挑戰的時候,要有一份舉重若輕、生命昂揚的生命展望,就算匍匐于歲月塵埃,也要仰望生命的星辰燦爛。 ??。
我20多年的VBA實踐經驗,全部濃縮在下面的各個教程中,教程學習順序:
*請認真填寫需求信息,我們會在24小時內與您取得聯系。