#
一直以來都是用自己編寫的地圖渲染引擎,客戶端使用openscales做應用展示,支持pc,android,iphone 已經實現了多個版本的地圖數據處理,包括 高德數據、四維數據從shp編譯成物理格式供渲染服務使用,這個過程復雜且費事 比較了mapabc的地圖,作為成熟的商業公司的產品,當然團隊多年積累的東西定是我一個人做的不能比擬的,渲染方面在大比例顯示處理的比自己好很多,主要自己沒有過多時間投入進去,在做完自己的地圖版本之后(sw2us.com/gps)考慮接入高德web地圖(sw2us.com/newgps)
以下對mapabc使用的經驗有感 我的應用采用flex技術,之前自己的地圖加載采用opensacles,到mapabc了便要換成高德的展示客戶端了
高德發布的最新flex sdk 2.4版本,可以訪問 code.mapabc.com,搞笑的是網站的鏈接缺只能下載2.3.3版本的sdk 高德官網的很多支持方式比較滑稽,根本不能提供任何幫助,QQ討論區每一個能加入的;bbs論壇根本沒人維護,回答問題沒有解答,這方面做的還是比較差的。 花了2天便完成了地圖遷移工作,還是主要是我的應用簡單的緣故吧! mapabc的api分公眾版本和企業版本,兩個版本差異很大,曾經以客戶名義聯系高德銷售,提供給我的一份sdk文檔與官網的文檔版本和內容差異很大,公眾版本除了能顯示基礎底圖之外,基本不具備其他令我滿意的設施,提供的api也不敬人意。在我遷移openscales代碼為高德sdk時碰到了很多問題。
--公眾版不具有gps到map坐標的轉換功能 --不具有地址解析功能(gps到文本地址),不能使用poi檢索功能 --訪問次數限制 --顯示層級限制,不能更小的比例尺顯示 --高德sdk 很多組件采用flash開發的,所以不能通過flex繼承圖來檢索組件的功能和接口,sdk提供的overlay對象居然沒有getBounds()方法,在處理多個overlap時檢測相交不方便 --沒有layers概念 openscales更像一個gis專業的客戶地圖展示程序,且隨意修改,支持air,我已經部署到iphone和android環境,而高德flex sdk更像一個玩具,一個非專業者使用的玩意兒,某些接口簡單但不夠靈活,且代碼封閉 高德現在成為apple在大陸的地圖數據供應商了,google也許會另擇圖商,也許是四維。apple當然會以3d地圖領航者的角色刮起新的地圖應用旋風,大家都跟著學吧 等我的地圖渲染優化好之后還是會放棄高德的sdk改用自己的地圖技術,當然那些需要付費的功能自己去實現嘍,3d是趨勢,不能讓自己落后了
全格Gps2012監控系統 我們是上海全格信息科技公司,我們的團隊以Gis位置服務系統為方向,多年來積累開發了多套Gps定位系統等核心產品,且擁有所有的技術能力和版權。 目前我們正在尋找合作伙伴,我們可以提供系統平臺服務且我們的強項也在于此,也可以做gps運維服務。 如果您用的系統也是同深圳那么多Gps廠家共用的一套系統的話,您可以看看我們的系統,參考一下優缺點。 >我們是掌握最新Gis應用服務的技術開發團隊 >我們擁有非常豐富的Gis開發、應用、實施的經驗和專業的精神 >我們提供.靈活的可配置、擴展的系統平臺,根據客戶需求而定制功能,包括:界面、操作接口、報表或者整合客戶的業務 >我們擁有自主的地圖平臺,提供B/S模式,不采用google,baidu等互聯網地圖,不采用geoserver等開源的地圖,完全我們自己開發的地圖引擎,速度快,效率高,設備運行要求低、靈活可擴展 >我們的監控系統采用flex技術,監控位置和報警完全實時,服務器主動推送gps信息到瀏覽器端,這一點是非flex技術絕不能做到的,所以設備運行狀態實現零延時 >我們的系統監控終端除了支持pc瀏覽器,還支持 android,iphone等移動終端訪問控制,可進行手機設防、監控軌跡、報警配置等功能,可通過app store和android市場下載安裝 >我們的有5年的Gps監控運營開發的經驗,系統設計容量達2w臺終端設備,與多個公司合作OEM我們的系統和終端產品 ~如果您想做Gps監控或者運營,也許您是個人或者是公司老板 ~如果您需要更靈活、可控、安全、穩定的GPS監控系統 ~如果您的需求規劃是低成本的 ~如果您需要部署一整套Gps服務平臺在自己的環境中,而不是又去代理使用他人的Gps運營平臺或者不想花巨資采用 mapabc,mapbar之類的系統 。。。。。 您可以考慮我們的技術方案,我們可以以最優質的服務、最先進的技術、最靈活的合作模式與您實現共贏 --------------------------------------------------------------------------------------------- 上海全格信息科技有限公司 Shanghai Triangle Info Tech Co,Ltd. 地址: 上海市閔行區立躍路2897號1幢302室 郵編: 201114 電話: 86-021-34680553 傳真: 86-021-64296802 郵件: service@sw2us.com 移動電話: 13661913244 網址: http://www.sw2us.com QQ: 2536588583@qq.com ---------------------------------------------------------------------------------------------
一直使用openscales 1.2.1版本開發webapp,在瀏覽器顯示地圖層,沒有問題 最近想把應用改到air下跑地圖顯示,結果死活地圖無法加載成功,同樣的代碼, <Map id="fxMap" width="400" height="300" resolution="0.001911274412400001" center="121.22,31.3" x="51" y="70" > <WMSC name="Nasa" layers="bluemarble" format="image/jpeg" version="1.1.1" url="http://sw2us.com:8001/wms"/> <DragHandler/> <WheelHandler/> </Map> 以上代碼webapp方式可以顯示地圖,但改成air方式不行 以為1.2.1的bug,所以改換openscales的2.0版本, 惡夢來了,2.0與1.2.1版本api變化非常巨大,基本上以前些的代碼都要作廢掉,坑爹啊 耐著性子,看了網上的2.0的api,做了test程序,發現wmsc地圖還是只能顯示在webapp模式下,air還是不行,肯定我哪里沒有琢磨清楚了的緣故。 不過還好,flex builder4.6下開發mobile應用沒有選擇air的提示,直接把wmsc加載成功,phone和android上可以顯示出地圖來,比較暗自高興, air的其中緣故還得把openscales的代碼翻出來鞭尸一遍才能曉得緣故 很想切換到2.0,畢竟看到了很多api的增強,但是應用代碼做遷移不容易啊,郁悶
用Qjson解析通信消息,一個200k的json包解析居然話了2s時間,比python的json慢了10倍 可恥啊可恥
dvr項目中flex駐留在瀏覽器,而影響播放程序是獨立的進程,sandbox的安全問題導致flex的代碼無法直接與播放進程IPC通信,那只有通過公網IP的主機進行橋接。 很多年以前用過foundstone系列的工具,也有socket轉向的功能,包括在5173時做過lsp的底層轉向軟件(仿sockcap),原理當然是相當簡單,python是首選工具。 代碼接收兩端建立socket進來,并根據相同的id號來進行socket配對,之后兩個socket之間就實現互相轉發(技術同之前寫的http代理服務器 ) 1 # -- coding:utf-8 -- 2 3 import socket,traceback,os,os.path,sys,time,struct,base64,gzip,array,threading 4 import select,json 5 6 7 ''' 8 {'id','type'} 9 10 type - 'mapshow','imageplay' 11 id - 一次會話的編號 12 13 imageplay 與xbridge建立socket連接,并注冊一個會話編號(隨機產生) 14 imageplay啟動mapshow,并將會話編號傳遞給mapshow,mapshow建立xbridge的連接,并提交會話編號 15 xbridge將雙向傳遞相同會話編號的數據到對方 16 17 sock1的客戶必須等sock2連接進入之后發送數據,否則將sock1數據轉發給sock2時將產生異常 18 ''' 19 20 class ConnectionPair: 21 def __init__(self,app): 22 self.app = app 23 self.id = '' 24 self.sock1=None #imageplay上來的連接 25 self.sock2=None #第二個連接上來的對象mapdemo 26 27 def start(self): 28 t = threading.Thread(target=self.threadRecv) 29 t.start() 30 31 def onLostConnection(self): 32 try: 33 print 'connection pair lost..' 34 self.sock1.close() 35 self.sock2.close() 36 self.app.onConnectionPairBroken(self) 37 except: 38 traceback.print_exc() 39 40 def threadRecv(self): 41 print 'service threading entering ' 42 import select 43 while True: 44 fds = [] 45 if self.sock1: 46 fds.append(self.sock1) 47 if self.sock2: 48 fds.append(self.sock2) 49 #fds = [self.sock1,self.sock2] 50 try: 51 #sock2未連接進來前,將不接收sock1上產生數據 52 #print 'fds:',len(fds),fds 53 rds,wds,eds = select.select(fds,[],[],1) 54 if not rds:#timeout 55 continue 56 57 for s in rds: 58 d = s.recv(1024) 59 #print d 60 if not d: 61 raise 'any jump' 62 63 to = self.sock2 64 if s == self.sock2: 65 to = self.sock1 66 #print 'redirect data:',d 67 to.sendall(d) 68 except: 69 traceback.print_exc() 70 self.onLostConnection() 71 break 72 73 print 'ConnThread Exiting ' 74 75 76 77 78 class XBridge: 79 def __init__(self,addr=('',12788)): 80 self.sock = None 81 self.addr = addr 82 self.conns={} #{id} 83 self.mtxconns = threading.Lock() 84 85 def onConnectionPairBroken(self,cp): 86 self.mtxconns.acquire() 87 del self.conns[cp.id] 88 print 'onConnectionPairBroken(),removed:',cp.id 89 self.mtxconns.release() 90 91 def start(self): 92 try: 93 94 self.sock = socket.socket() 95 #print 'lll',self.addr 96 self.sock.bind( tuple(self.addr) ) 97 self.sock.listen(5) 98 99 self.thread = threading.Thread(target=self.service_loop) 100 self.thread.start() 101 print 'xbridge started!' 102 self.thread.join() 103 except: 104 traceback.print_exc() 105 return False 106 107 def shutdown(self): 108 self.sock.close() 109 110 111 def service_loop(self): 112 113 while True: 114 fdr = [] 115 fdr.append(self.sock) 116 infds,wr,e = select.select(fdr,[],[]) 117 if e: 118 print 'service thread exit ' 119 break 120 for s in infds: 121 if s == self.sock: #新連接到達 122 sock = None 123 try: 124 sock,peer = self.sock.accept() #異常產生表示self.sock被強行關閉 125 print 'new client incoming ',peer 126 except: 127 return 128 thread = threading.Thread(target=self.threadNewClient,args=(sock,)) 129 thread.start() 130 131 def threadNewClient(self,sock): 132 #等待注冊信息進入 ,5 秒超時 133 try: 134 fdr = [sock,] 135 print 'enter select ' 136 infds,wr,e = select.select(fdr,[],[],5) 137 138 if not infds: 139 sock.close() 140 print 'client register timeout' 141 return #接收超時 142 d = sock.recv(1024) 143 d = json.loads(d) 144 id,type = d['id'],d['type'] 145 connpair = None 146 print id,type 147 self.mtxconns.acquire() 148 if type == 'imageplay': 149 150 cp = ConnectionPair(self) 151 cp.id = id 152 cp.sock1 = sock 153 self.conns[id] = cp 154 cp.start() 155 156 elif type =='mapshow': 157 connpair = self.conns.get(id,None) 158 if connpair == None: #沒找到imageplay 159 sock.close() 160 print 'mapshow cannt found imageplay..' 161 else: 162 print 'mapclient matched!' 163 connpair.sock2 = sock 164 else: 165 print 'unknown command id:',id,type 166 167 self.mtxconns.release() 168 except: 169 sock.close() 170 traceback.print_exc() 171 172 if __name__=='__main__': 173 XBridge().start() #default '',12788 174
焦距的計算公式 視場和焦距的計算 視場指被攝取物體的大小,視場的大小是以鏡頭至被攝取物體距離,鏡頭焦頭及所要求的成像大小確定的。 (1) 焦距的計算 鏡頭的焦距,視場大小及鏡頭到被攝取物體的距離的計算如下: f=wL/W f=hL/h f;鏡頭焦距 w:圖象的寬度(被攝物體在CCD靶面上成象寬度) W:被攝物體寬度 L:被攝物體至鏡頭的距離 h:圖象高度(被攝物體在ccd靶面上成像高度)視場(攝取場景)高度 H:被攝物體的高度 CCD靶面規格尺寸:單位mm 規格 1/3" 1/2" 2/3" 1" W 4.8 6.4 8.8 12.7 H 3.6 4.8 6.6 9.6 由于攝像頭畫面寬度和高度與電視接收機畫面寬度和高度一樣,其比例均為4:3,當L不變,H或W增大時,f變小,當H或W不變,L增大時,f增大。 舉例:假設用1/2”CCD攝像頭觀測,被測物體寬440毫米,高330毫米,鏡頭焦點距物體2500毫米。 由公式可以算出: 焦距f=6.4 * 2500 / 440≈36毫米或 焦距f=4.8 * 2500 / 330≈36毫米 當焦距數值算出后,如果沒有對應焦距的鏡頭是很正常的,這時可以根據產品目錄選擇相近的型號,一般選擇比計算值小的,這樣視角還會大一些。 (2) 視場角的計算 如果知道了水平或垂直視場角便可按公式計算出現場寬度和高度。 W=2LtanQw/2 ( Qw:水平視角) H=2LtanQh/2 ( Qh:垂直視角) 水平視場角Qw(水平觀看的角度) Qw =2tg-1(W/2L) 垂直視場角Qh(垂直觀看的角度) Qh =2tg-1(H/2L) 視場由寬(W)、高(H)和與攝像頭的距離(L)決定,一旦決定了攝像頭要監視的景物,正確地選擇鏡頭的焦距就由來3個因素決定: l 欲監視景物的尺寸 l 攝像頭與景物的距離 l 攝像頭成像器的尺寸 8、選配鏡頭的原則 為了獲得預期的攝像效果,在選配鏡頭時,應著重注意六個基本要素:(1)被攝物體的大小;(2) 被攝物體的細節尺寸;(3) 物距;(4)焦距;(5) CCD攝像機靶面的尺寸;(6) 鏡頭攝像系統的分辯率。
今天去轉了一圈,坐著一上午,屁股有點累。了解了這是個啥東東了,不是特別有兩點,下午都是廠商吹牛皮,所以吃了頓飯就回公司了
花了近3周時間去完成DVR項目的視頻影像管理系統。目標容量200T,利用廉價PC實現集群存儲,由于存儲的是單個的視頻段文件且對于文件容災方面沒有特殊的要求,允許單點存儲損壞。 系統部署一個stoMaster服務器做控制服務,提供影像系統的讀寫調度分配、系統模塊監控管理、系統影像查詢服務;若干個stoNodeServer作為單點存儲服務器,每個節點服務器下掛載10個2T普通硬盤,單節點支持20T容量,由于采用PC架構,大大節省成本且還能保證一定IO并發能力,保證200T容量需要10臺PC做支撐。 開發涉及技術: python + ffmpeg + flex + openscales + swMapServer + Vs2008 + Qt + postgis + psycopg2 + comtypes Links: http://sw2us.com/sites/default/files/dvr.demo.v0.1.0_2012.3.27.zip幸好有了python這個好幫手,不然要干死了,python對我來講不是簡單的當膠水輔助了,通信框架、UI、數據庫都采用python,只有那些個點上用了高效點的c++,例如:ffmpeg解碼、文件存儲等等 演示視頻:     系統運行demo:   
摘要: 項目需求開發網絡流媒體播放器,整個項目就一人開發,整個系統平臺,包括調度,存儲集群服務,影像同步導入、系統api接口、視頻查詢和播放客戶端,一切有了python就變得簡單。一個人在戰斗,還是蠻有勁道。pyqt開發播放界面,python用于網絡通信和粘合邏輯,ffmpeg用于解碼,google一圈試用了幾個pyffmpeg的庫,非常不理想,干脆自己做:采用ctypes訪問dll,測試解碼并將視頻幀轉... 閱讀全文
|