#
一直以来都是用自己编写的地图渲染引擎,客户端使用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,测试解码并将视频帧转... 阅读全文
|