socketref,再见!高德

https://github.com/adoggie

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用链接

留言簿(54)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

一直以来都是用自己编写的地图渲染引擎,客户端使用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是趋势,不能让自己落后了



posted @ 2012-07-07 00:51 放屁阿狗 阅读(2044) | 评论 (0)编辑 收藏

全格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之类的系统
。。。。。
您可以考虑我们的技术方案,我们可以以最优质的服务、最先进的技术、最灵活的合作模式与您实现共赢
请访问我们的网站: www.sw2us.com      
Gps系统访问地址: www.sw2us.com/gps
---------------------------------------------------------------------------------------------
上海全格信息科技有限公司
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
---------------------------------------------------------------------------------------------
posted @ 2012-06-30 01:24 放屁阿狗 阅读(688) | 评论 (0)编辑 收藏

一直使用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的增强,但是应用代码做迁移不容易啊,郁闷



posted @ 2012-06-12 23:50 放屁阿狗 阅读(606) | 评论 (0)编辑 收藏

用Qjson解析通信消息,一个200k的json包解析居然话了2s时间,比python的json慢了10倍
可耻啊可耻
posted @ 2012-05-11 12:30 放屁阿狗 阅读(641) | 评论 (1)编辑 收藏

东西都要大家分享 :-)
posted @ 2012-04-14 17:53 放屁阿狗 阅读(1711) | 评论 (1)编辑 收藏


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    
posted @ 2012-04-14 17:42 放屁阿狗 阅读(1683) | 评论 (0)编辑 收藏


焦距的计算公式

视场和焦距的计算
  视场指被摄取物体的大小,视场的大小是以镜头至被摄取物体距离,镜头焦头及所要求的成像大小确定的。

(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) 镜头摄像系统的分辩率。

posted @ 2012-04-02 01:13 放屁阿狗 阅读(360) | 评论 (0)编辑 收藏

今天去转了一圈,坐着一上午,屁股有点累。了解了这是个啥东东了,不是特别有两点,下午都是厂商吹牛皮,所以吃了顿饭就回公司了
posted @ 2012-03-30 13:40 放屁阿狗 阅读(234) | 评论 (0)编辑 收藏

花了近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:






posted @ 2012-03-27 19:23 放屁阿狗 阅读(1862) | 评论 (2)编辑 收藏

     摘要: 项目需求开发网络流媒体播放器,整个项目就一人开发,整个系统平台,包括调度,存储集群服务,影像同步导入、系统api接口、视频查询和播放客户端,一切有了python就变得简单。一个人在战斗,还是蛮有劲道。pyqt开发播放界面,python用于网络通信和粘合逻辑,ffmpeg用于解码,google一圈试用了几个pyffmpeg的库,非常不理想,干脆自己做:采用ctypes访问dll,测试解码并将视频帧转...  阅读全文
posted @ 2012-03-15 02:01 放屁阿狗 阅读(1509) | 评论 (0)编辑 收藏

仅列出标题
共25页: 1 2 3 4 5 6 7 8 9 Last