- 浏览: 263848 次
- 性别:
- 来自: 济南
-
最新评论
-
mfkdzhou:
ths ,正在找openfire的东西
openfire总结 -
mfkdzhou:
ths ,正在找openfire的东西
openfire插件开发(1) -
yuanq_20:
老大,你这个pdf,不完整啊,但还是谢谢啦!
《深入浅出设计模式》(Head First Design Patterns)第15届JOLT获奖作品(附pdf中文文档和源码) -
sckim805:
haohaohao..!!!!
多线程的例子,超级经典,可以学习学习 -
lhy2012:
学习了
多线程的例子,超级经典,可以学习学习
K_ReverterMap2.0说明-基于google api
K_ReverterMap2.0是K_Reverter在Google Maps API2.0的基础上进行地图开发的时候得到的一些Gmap2相关的控件和功能,现在将这些控件提供给大家分享,这些控件大家可以单独使用,也可以统一下载或直接调用使用包含所有控件的Step1Map2.js,因为本人的站点服务器机器性能不好,所以不推荐直接调用本站的JS文件,不过假如您采用了本站的部分代码,建议经常光顾本站察看是否更新,呵呵
所有的控件都是针对Google Maps API 2.0而制作,因此,可能在脱离了Google Maps API 2.0之后不能运行,您可以在这儿浏览关于Google Maps API 2.0的信息
具体的基于Google Maps的简单应用,您可以看看Step1地图浏览服务和Google Earth地标文件下载系统
想看到更多K_Reverter关于Google Maps API的文章,请浏览Google Maps API专栏
K_ReverterMap2.0说明
本文来源于Step1,由K_Reverter撰写并随时修改,有任何问题请到评论区留言
自定义公用函数
K_Function(一些公用函数的集合)
我在这次升级的时候特意将所有公用函数函数组合到这个类的静态方法里面,使代码结构更加清晰,由于K_Function的方法都是静态方法,因此不需要构造而直接通过KFunction.functionName()形式调用即可
K_Function包含以下公用函数,都是静态函数
K_Function.GetQueryString(key) | 获得当前页的QueryString中的指定项,返回对应的值,如果不存在,返回空字符串 "" 而不是null,例如,当前的网址是index.html?id=3&page=5,则K_GetQueryString("id")返回3,而K_GetQueryString("page")返回5. |
K_Function.GetCallBack(obj,method) | 取得回调句柄的函数,这个函数虽然简单,可是因为在异步和事件处理之中非常重要而定义,返回一个函数,该函数代表运行obj对象的method方法. |
K_Function.InheritClass(obj,cla) | 将类cla的所有方法传递给obj对象,Google Maps API之中利用这个功能来实现继承,由于这个函数没有开放,我只好将代码抄录出来了 |
K_Function.SetCookie(name, value) | 写入Cookie键值. |
K_Function.DelCookie(name) | 删除Cookie键值. |
K_Function.GetCookie(name) | 读取Cookie键值. |
以下是该类的定义源码:
function K_Function(){} //读取网址后缀的函数 K_Function.GetQueryString=function(key) { var returnValue =""; var sURL = window.document.URL; if (sURL.indexOf("?") > 0) { var arrayParams = sURL.split("?"); var arrayURLParams = arrayParams[1].split("&"); for (var i = 0; i < arrayURLParams.length; i++) { var sParam = arrayURLParams[i].split("="); if ((sParam[0] ==key) && (sParam[1] != "")) returnValue=sParam[1]; } } return returnValue; } K_Function.GetCallBack=function(obj,func) { return function(){return func.apply(obj,arguments)}; } K_Function.InheritClass=function(a,b) { var c=function(){}; c.prototype=b.prototype; a.prototype=new c(); }; //Cookie操作函数 K_Function.GetCookieVal=function(offset) { var endstr = document.cookie.indexOf (";", offset); if (endstr == -1) endstr = document.cookie.length; return unescape(document.cookie.substring(offset, endstr)); } K_Function.SetCookie=function(name, value) { var expdate = new Date(); var argv = K_Function.SetCookie.arguments; var argc = K_Function.SetCookie.arguments.length; var expires = (argc > 2) ? argv[2] : null; var path = (argc > 3) ? argv[3] : null; var domain = (argc > 4) ? argv[4] : null; var secure = (argc > 5) ? argv[5] : false; if(expires!=null) expdate.setTime(expdate.getTime() + ( expires * 1000 )); document.cookie = name + "=" + escape (value) +((expires == null) ? "" : ("; expires="+ expdate.toGMTString()))+((path == null) ? "" : ("; path=" + path)) +((domain == null) ? "" : ("; domain=" + domain))+((secure == true) ? "; secure" : ""); } K_Function.DelCookie=function(name) { var exp = new Date(); exp.setTime(exp.getTime() - 1); var cval =K_GetCookie(name); document.cookie = name + "=" + cval + "; expires="+ exp.toGMTString(); } K_Function.GetCookie=function(name) { var arg = name + "="; var alen = arg.length; var clen = document.cookie.length; var i = 0; while (i < clen) { var j = i + alen; if (document.cookie.substring(i, j) == arg) return K_Function.GetCookieVal(j); i = document.cookie.indexOf(" ", i) + 1; if (i == 0) break; } return null; }
自定义地图类型MapTypes
K_51ditu_MAP(调用灵图的地图API实现的地图类型)
K_51ditu_MAP采用Google新接口的模式实现,能够和Google比较完美的结合,这次升级的时候没有采用MOSP的模式,因为那个模式比较慢.
注意:根据Google文档的说明,向地图上添加类型最好在地图已经使用setCenter设置了地图的位置之后再运行,否则可能出错,而且假如你要使用GMapTypeControl控件显示地图类型列表,一定要在使用前添加K_51ditu_MAP,否则不会显示在列表之中。
以下是一个使用范例:
map.addMapType(K_51ditu_MAP); map.setMapType(K_51ditu_MAP);查看范例(K_51ditu_MAP.html)
自定义标记 Overlays
K_ImageOverlay(用来在地图上显示一张图片的控件)
K_ImageOverlay是一个自定义的Overlay,用法和Google Map中自定义的GMarker和GPolyline差不多,都是通过GMap2的addOverlay(overlay)添加到地图之中,通过removeOverlay(overlay)从地图中移除。
千万注意:考虑到系统性能的问题,一张图片在地图缩放级别变化时可能被显示的很大,这样可能影响性能
当显示的问题解决,最大的问题就在于怎样才能知道一张图片显示所需要的GLatLngBounds和rotation的值呢?这个问题比较复杂,我尝试写了一个WebService能够还算有点精确的处理这个问题,如果WebService客户端在地图上取三个特征点,将三个特征点在图片上的坐标和经纬度坐标发送到WebService,就能从返回结果中获得该GBounds和rotation的值,WebService的地址在http://www.step1.cn/map/addOverlay.asmx,更具体的内容我会在以后专文讨论。
K_ImageOverlay的构造函数有4个参数,分别为
imageUrl | 图片的Url地址 |
bounds | 用来描述图片显示区域矩形经纬度的GLatLngBounds,如果需要进行图片旋转,则应该是旋转前的矩形 |
rotation | 图片的顺时针旋转角,用度数表示,(-180 ~ 180) |
opacity | 图片的显示不透明度(0~1),该值越小越透明 |
使用这样几个参数是有原因的,因为在Google Earth的KML文件之中,添加一个图片在Google Earth主要就是这几个参数,因此,使用此控件来显示从KML文件中读取出来的GroundOverlay,直接将参数传递即可,不需要任何形式的转化。
K_ImageOverlay主要方法有
setOpacity | 重新设置图片的不透明度,必须在该Overlay已经添加到地图中之后 |
display | 用参数true和false来指定该图片是否显示 |
以下是该类的定义源码:
//地图上显示一张地图图片的标注类型 function K_ImageOverlay(imageUrl,bounds,rotation,opacity) { this.imageUrl=imageUrl; this.bounds=bounds; this.rotation=-rotation; this.opacity=opacity||0.45; } K_ImageOverlay.prototype = new GOverlay(); K_ImageOverlay.prototype.initialize=function(a) { this.map=a; if(this.rotation>5 || this.rotation<-5) { this.drawElement=document.createElement("v:Image"); this.drawElement.style.rotation=this.rotation; } else this.drawElement=document.createElement("img"); this.drawElement.title=this.imageUrl; this.drawElement.style.position="absolute"; this.drawElement.style.filter="progid:DXImageTransform.Microsoft.Alpha(opacity="+(this.opacity*100)+");"; this.drawElement.src=this.imageUrl; if(document.all==1) { this.drawElement.unselectable="on"; this.drawElement.onselectstart=function(){return false}; this.drawElement.galleryImg="no" } else { this.drawElement.style.MozUserSelect="none" } this.drawElement.style.border="0"; this.drawElement.style.padding="0"; this.drawElement.style.margin="0"; this.drawElement.oncontextmenu=function(){return false}; a.getPane(G_MAP_MARKER_PANE).appendChild(this.drawElement); }; K_ImageOverlay.prototype.redraw=function(a) { if(!a)return; var min=this.map.fromLatLngToDivPixel(this.bounds.getSouthWest()); var max=this.map.fromLatLngToDivPixel(this.bounds.getNorthEast()); this.drawElement.style.left=(min.x)+"px"; this.drawElement.style.top=(max.y)+"px"; this.drawElement.style.width=(max.x-min.x)+"px"; this.drawElement.style.height=(min.y-max.y)+"px"; }; K_ImageOverlay.prototype.setOpacity=function(opacity) { this.opacity=opacity||0.45; this.drawElement.style.filter="progid:DXImageTransform.Microsoft.Alpha(opacity="+(this.opacity*100)+");"; } K_ImageOverlay.prototype.copy=function() { return new K_ImageOverlay(this.imageUrl,this.bounds,this.rotation,this.opacity) }; K_ImageOverlay.prototype.remove=function() { this.drawElement.parentNode.removeChild(this.drawElement); }
以下是一个使用范例:
var bounds=new GLatLngBounds(new GLatLng(18.0400740574296,108.548384827952),new GLatLng(20.3537745028853,111.729042228649)); imageOverlay=new K_ImageOverlay("http://www.gogocn.com/admin/map/map_hainan.jpg",bounds,0,0.5); map.addOverlay(imageOverlay);查看范例(K_ImageOverlay.html)
K_IconOverlay(在地图上显示一个小图标的对象)
K_IconOverlay是一个自定义的Overlay,用法和Google Map中自定义的GMarker和GPolyline差不多,都是通过GMap2的addOverlay(control)添加到地图之中,通过removeOverlay(control)从地图中移除。
K_IconOverlay用来向地图上添加一个图标,同样是向地图上添加一个图片,该图标和K_ImageOverlay不同在于,K_ImageOverlay主要是用来添加地图图片,而这个主要是添加一个图标,功能开发的侧重点不同。
K_IconOverlay功能非常强大,除了可以指定大小之外,甚至还可以从一张大图片上截取一小块图片作为图标,这个功能开发不仅仅是为了显得Cool,因为在Google Earth的KML文件之中,很多图标就是这样存放的,支持这个功能就等于可以在Google Map之中查看KML地标文件中的标记,而且是能将Google Earth的集成图标显示出来,想必是比较实用的
K_IconOverlay的构造函数有4个参数,分别为
imageUrl | 图标的引用文件地址 |
point | 图标的显示位置经纬度,应该是一个GLatLng |
scale | 图标的显示缩放倍数 |
bounds | 可选,图标如果是从一个大图片文件上截取的,bounds代表截取区域,应该是一个GBounds,值得注意的是,为了和地理坐标对应,图片以左下角坐标为(0,0),而不是大家习惯的左上角 |
K_IconOverlay完全参照于GMarker,该Overlay提供的方法和使用方式完全可以参照GMarker.
如果要给此K_IconOverlay添加infowindow的显示,也可以完全参照GMarker的用法,具体可以查看范例(8.markerinfowindow.html)
以下是该类的定义源码:
//在地图上显示一个小图标的标注类型 function K_IconOverlay(imageUrl,point,scale,bounds,color) { this.imageUrl=imageUrl; this.point=point; this.scale=scale?scale:1; this.bounds=bounds; this.color=color; this.icon=new Object(); this.icon.iconSize=new GSize(this.scale*32,this.scale*32); } K_IconOverlay.prototype = new GOverlay(); K_IconOverlay.prototype.initialize=function(a) { this.map=a; this.div=document.createElement("img"); a.getPane(G_MAP_MARKER_PANE).appendChild(this.div); GEvent.bindDom(this.div,"load",this,this.setClip); this.div.style.display="none"; this.div.src=this.imageUrl; this.div.style.position="absolute"; if(document.all) { this.div.unselectable="on"; this.div.onselectstart=function(){return false}; this.div.galleryImg="no"; this.div.style.filter="progid:DXImageTransform.Microsoft.Chroma(color='#"+this.color+"')"; } else { this.div.style.MozUserSelect="none"; } this.div.style.border="0"; this.div.style.padding="0"; this.div.style.margin="0"; color=(this.color)?this.color:"FFFFFF"; this.div.style.cursor=document.all?"hand":"pointer"; this.div.oncontextmenu=function(){return false}; GEvent.bindDom(this.div,"mousedown",this,this.onMouseDown); }; K_IconOverlay.prototype.setClip=function() { this.div.style.display=''; this.currentSize=new GSize(this.div.offsetWidth,this.div.offsetHeight); if(this.bounds) { this.div.style.clip="rect("+((this.currentSize.height-this.bounds.maxY)*this.scale)+"px "+(this.bounds.maxX*this.scale)+"px "+((this.currentSize.height-this.bounds.minY)*this.scale)+"px "+(this.bounds.minX*this.scale)+"px)"; this.icon.iconSize=new GSize(this.scale*(this.bounds.maxX-this.bounds.minX),this.scale*(this.bounds.maxY-this.bounds.minY)); } else this.icon.iconSize=new GSize(this.scale*this.currentSize.width,this.scale*this.currentSize.height); this.div.width=(this.currentSize.width*this.scale); this.div.height=(this.currentSize.height*this.scale); this.div.style.display=''; this.redraw(true); } K_IconOverlay.prototype.remove=function() { this.div.parentNode.removeChild(this.div); }; K_IconOverlay.prototype.setPoint=function(point) { this.point=point; this.redraw(true); }; K_IconOverlay.prototype.getIcon=function() { return this.icon; }; K_IconOverlay.prototype.copy=function() { return new K_IconOverlay(this.imageUrl,this.point,this.scale,this.bounds,this.color); }; K_IconOverlay.prototype.redraw=function(a) { if(!a)return; if(!this.currentSize)return; var c=this.map.fromLatLngToDivPixel(this.point); if(this.bounds) { this.div.style.left=(c.x-(this.bounds.maxX+this.bounds.minX)/2*this.scale)+"px"; this.div.style.top=(c.y-(this.currentSize.height*2-this.bounds.maxY-this.bounds.minY)/2*this.scale)+"px"; } else { this.div.style.left=(c.x-this.currentSize.width*this.scale/2)+"px"; this.div.style.top=(c.y-this.currentSize.height*this.scale/2)+"px"; } }; K_IconOverlay.prototype.onMouseDown=function(a) { if(document.all) { window.event.cancelBubble=true; window.event.returnValue=false } else { a.cancelBubble=true; a.preventDefault(); a.stopPropagation() } GEvent.trigger(this,"click",this); }; K_IconOverlay.prototype.openInfoWindowHtml=function(html) { this.map.openInfoWindowHtml(this.point,html); }
以下是一个使用范例:
var point=new GLatLng(29.94176113301537,112.6857368551186); iconOverlay=new K_IconOverlay("/Map/Icons/palette-2.png",point,1,new GBounds(160,192,192,224)); map.addOverlay(iconOverlay);查看范例(K_IconOverlay.html)
K_HtmlMarker(用来在地图上显示带文字的标记)
K_HtmlMarker是一个自定义的Overlay,用法和Google Map中自定义的GMarker和GPolyline差不多,都是通过GMap2的addOverlay(control)添加到地图之中,通过removeOverlay(control)从地图中移除。
这次更新对K_HtmlMarker进行了大幅调整,以前K_HtmlMarker是一个独立的Overlay,而现在,K_HtmlMarker的主要功能是在原有的Marker旁边添加文字而成为一个新的Marker,我觉得这样组织比较灵活,本来我更希望能做一个类似于GIcon的对象,可是后来发现GIcon和Gmarker从代码上来讲密不可分,所以我只好采用了这个方案。
该控件名称为K_HtmlMarker来自于它的上一个版本的设计构思,实际上不推荐在名称之中使用HTML语法,当然,简单的比如字体颜色是没有问题的
K_HtmlMarker的构造函数有3个参数,分别为
icon | 注意不是图标,而是用来作为图标的一个Overlay,这个Overlay可以是一个GMarker,也可以是一个K_IconOverlay,这个Overlay应该是还没有添加到地图之中的,可以不设置该Overlay的经纬度,因为K_HtmlMarker会设置该Overlay的经纬度以便显示在一起,实际上Overlay的经纬度设置会被忽略。 |
point | 标记的显示位置经纬度,应该是一个GLatLng |
html | 标记显示的文字Label内容 |
K_HtmlMarker虽然本身包含一个Overlay,可是使用方法和一个单一的Overlay没有什么不同,该Overlay提供的方法和使用方式完全可以参照GMarker.
如果要给此K_HtmlMarker添加infowindow的显示,也可以完全参照GMarker的用法,具体可以查看范例(8.markerinfowindow.html)
以下是该类的定义源码:
//自定义的HTML marker标注类型,以指定点显示HTML内容 function K_HtmlMarker(icon,point,html) { this.icon=icon; this.point=point; this.html=html; } K_HtmlMarker.prototype = new GOverlay(); K_HtmlMarker.prototype.initialize=function(a) { this.map=a; a.addOverlay(this.icon); this.icon.setPoint(this.point); this.icon.initialize(a); GEvent.bindDom(this.icon,"mousedown",this,this.onMouseDown); this.div=document.createElement("span"); this.div.align="left"; this.div.style.position="absolute"; this.div.style.cursor="default"; this.div.style.width="200px"; this.div.innerHTML=this.html; a.getPane(G_MAP_MARKER_PANE).appendChild(this.div); GEvent.bind(this.icon,"click",this,this.onMouseDown); }; K_HtmlMarker.prototype.remove=function(){this.icon.remove();if(this.div&&this.div.parentNode){this.div.parentNode.removeChild(this.div)}}; K_HtmlMarker.prototype.copy=function() { return new K_HtmlMarker(this.icon.copy(),this.point,this.html) }; K_HtmlMarker.prototype.redraw=function(a) { this.icon.redraw(a); if(!a)return; var c=this.map.fromLatLngToDivPixel(this.point); iconSize=this.icon.getIcon().iconSize?this.icon.getIcon().iconSize:new GSize(32,32); this.div.style.left=(c.x+iconSize.width/2)+"px"; this.div.style.top=(c.y-this.div.offsetHeight/2)+"px"; }; K_HtmlMarker.prototype.onMouseDown=function(a) { if(document.all) { window.event.cancelBubble=true; window.event.returnValue=false } else { a.cancelBubble=true; a.preventDefault(); a.stopPropagation() } GEvent.trigger(this,"click",this); }; K_HtmlMarker.prototype.openInfoWindowHtml=function(html) { this.map.openInfoWindowHtml(this.point,html); }
以下是一个使用范例:
var point=new GLatLng(29.94176113301537,112.6857368551186);
htmlOverlay=new K_HtmlMarker(new GMarker(point),point,"My Hometown");
map.addOverlay(htmlOverlay);
查看范例(K_HtmlMarker.html)
自定义控件Controls
K_CrossControl(显示地图中心十字的控件)
K_CrossControl是一个自定义的Control,用法和Google Map中自定义的控件差不多,都是通过GMap2的addControl(control) 添加到地图之中,通过removeControl(control) 从地图中移除。
K_CrossControl会在地图上显示一个十字准星,当需要用户在地图上选择一个点的时候非常有用,
K_CrossControl这次更新有所改动,现在在地图大小可能变化的时候也能运行正常了
K_CrossControl更新到2.0之后取消了VML的显示模式,同意都采用图片的形式显示
K_CrossControl的构造函数有2个参数,都是可选参数,分别为
image | 中心十字图片的路径,默认为[http://www.step1.cn/map/cross.gif]![]() |
size | 中心十字图片的大小,默认为20*20 |
以下是该类的定义源码:
//显示地图中心十字的控件 function K_CrossControl(image,size) { this.size=size?size:new GSize(20,20); this.image=image?image:"http://www.step1.cn/map/cross.gif"; this.div=document.createElement("div"); this.img=document.createElement("img"); this.div.appendChild(this.img); this.div.style.position="absolute"; this.img.style.position="absolute"; } K_CrossControl.prototype=new GControl(true,false); K_CrossControl.prototype.initialize=function(map) { if(this.img.src!=this.image) { this.img.src=this.image; } this.img.width=this.size.width; this.img.height=this.size.height; this.resetSize(); map.getContainer().appendChild(this.div); GEvent.bind(map,"resize",this,this.resetSize()); return this.div; } K_CrossControl.prototype.resetSize=function() { this.img.style.left=(map.getSize().width/2-this.size.width/2)+"px"; this.img.style.top=(map.getSize().height/2-this.size.height/2)+"px"; } K_CrossControl.prototype.getDefaultPosition=function() { return new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(0,0)); }
以下是一个使用范例:
map.addControl(new K_CrossControl());查看范例(K_CrossControl.html)
K_HtmlControl(在地图上显示HTML内容的对象)
K_HtmlControl是一个自定义的Control,用法和Google Map中自定义的控件差不多,都是通过GMap2的addControl(control) 添加到地图之中,通过removeControl(control) 从地图中移除。
K_HtmlControl用来在地图上指定位置显示一个自定义的HTML内容。
K_HtmlControl的构造函数有1个参数
html | 要显示的HTML内容 |
以下是该类的定义源码:
function K_HtmlControl(html) { this.html=html; } K_HtmlControl.prototype=new GControl(true,false); K_HtmlControl.prototype.initialize=function(a) { this.Map=a; this.div=document.createElement("div"); this.div.style.cursor="default"; this.div.style.position="absolute"; this.div.unselectable="on"; this.div.onselectstart=function(){return false}; this.div.style.fontSize="11px"; this.div.style.fontFamily="Arial, sans serif"; this.div.style.MozUserSelect="none" this.div.innerHTML=this.html; a.getContainer().appendChild(this.div); GEvent.bindDom(this.div,"click",this,this.onClick); return this.div; }; K_HtmlControl.prototype.getDefaultPosition=function() { return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT,new GSize(10,10)) }; K_HtmlControl.prototype.onClick=function() { GEvent.trigger(this,"click"); }
以下是一个使用范例:
htmlControl=new K_HtmlControl("<div style='padding:3;background-color:white;border:solid 1 black;cursor:hand;'>www.step1.cn</div>"); map.addControl(htmlControl); GEvent.addListener(htmlControl,"click",function(){self.location="http://www.step1.cn";});查看范例(K_HtmlControl.html)
其它相关类
K_PointMover(让点沿轨迹移动的类)
K_PointMover用来让一个地理点按照指定的速度沿着指定的轨迹移动,有了这个类,我们就可以非常容易的实现让一个地图上的Overlay在地图上移动(类似有的网站查询行车路线后的车跑动的示例),或者是让地图自身自动的移动位置
K_PointMover的构造函数有4个参数
points | 点的移动轨迹,通过数组形式指定路线上的一些点的经纬度坐标 |
time | 每两次调整点的位置间隔的毫秒数,默认为100,1秒=1000毫秒 |
rate | 每次移动的跨度,这个大约是以经纬度作为单位的,因此在缩放系数低的情况下,1个单位将是一个非常快的速度 |
handle | 每次调整点的位置之后运行的句柄,运行时,以K_PointMover对象本身做参数,因此,可以使用K_PointMover的points属性来访问当前该点的位置 |
K_PointMover有2个方法
Move | 开始执行移动过程,移动完成之后,该点会停留在终点,不过假如完成后重新调用该函数,则自动从起点开始重新执行该移动过程 |
Pause | 暂停移动过程,通过Move重新开始从暂停的地方开始移动 |
以下是该类的定义源码:
function K_PointMover(points,time,rate,handle) { this.points=points; this.time=time?time:100; this.rate=rate?rate:1; this.handle=handle; this.pointsIndex=0; this.numberIndex=0; } K_PointMover.prototype.Move=function() { if(!this.timer) { this.timer=setInterval(K_Function.GetCallBack(this,this.Move),this.time); this.point=this.points[this.pointsIndex]; if(this.handle) { this.handle.call(null,this); } return; } else { if(!this.offset) { offsetX=this.points[this.pointsIndex+1].lng()-this.points[this.pointsIndex].lng(); a=Math.log((1+Math.sin(this.points[this.pointsIndex].lat()*Math.PI/180))/(1-Math.sin(this.points[this.pointsIndex].lat()*Math.PI/180)))*180/Math.PI/2; a1=Math.log((1+Math.sin(this.points[this.pointsIndex+1].lat()*Math.PI/180))/(1-Math.sin(this.points[this.pointsIndex+1].lat()*Math.PI/180)))*180/Math.PI/2; offsetY=a1-a;//this.points[this.pointsIndex+1].lat()-this.points[this.pointsIndex].lat(); offset=Math.sqrt(Math.pow(offsetX,2)+Math.pow(offsetY,2)); if(offset==0) this.offset=new GSize(0,0); else this.offset=new GSize(offsetX/offset,offsetY/offset); } var lng=this.points[this.pointsIndex].lng()+this.rate*this.offset.width*(this.numberIndex+1); var lat=Math.log((1+Math.sin(this.points[this.pointsIndex].lat()*Math.PI/180))/(1-Math.sin(this.points[this.pointsIndex].lat()*Math.PI/180)))*180/Math.PI/2+this.rate*this.offset.height*(this.numberIndex+1); lat=(Math.asin((Math.pow(Math.E,lat*Math.PI/180*2)-1)/(Math.pow(Math.E,lat*Math.PI/180*2)+1))*180/Math.PI); if((lng-this.points[this.pointsIndex].lng())*(lng-this.points[this.pointsIndex+1].lng())<0 || (lat-this.points[this.pointsIndex].lat())*(lat-this.points[this.pointsIndex+1].lat())<0) { this.point=new GLatLng(lat,lng); if(this.handle) this.handle.call(null,this); this.numberIndex++; } else { this.pointsIndex++; this.numberIndex=0; this.offset=null; this.point=this.points[this.pointsIndex]; if(this.handle) this.handle.call(null,this); if(this.pointsIndex>=this.points.length-1) { clearInterval(this.timer); this.pointsIndex=0; this.numberIndex=0; } } } } K_PointMover.prototype.Pause=function() { if(this.timer) { clearInterval(this.timer); this.timer=null; } }
以下是一个使用范例:
var map; var moveMarker,pointMover; function onLoad() { map = new GMap2(document.getElementById("map")); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.addControl(new K_CrossControl()); map.setCenter(new GLatLng(36.94,106.08),4); var points=[new GLatLng(53.561,123.261),new GLatLng(18.161,109.572),new GLatLng(39.465,73.657),new GLatLng(48.277,134.708),new GLatLng(53.561,123.261)]; var polyline=new GPolyline(points); map.addOverlay(polyline); moveMarker=new GMarker(points[0]); map.addOverlay(moveMarker); pointMover=new K_PointMover(points,100,0.1,MapMove); } function MapMove(pointMover) { if(document.getElementById("MarkerMove").checked) moveMarker.setPoint(pointMover.point); if(document.getElementById("MapMove").checked) map.panTo(pointMover.point); }查看范例(K_PointMover.html)
K_XmlLoader(快捷的载入Xml文件或访问WebService的类)
K_XmlLoader 由于可能用到的KML文件和WebService比较多,因此我使用这个类来统一访问代码,该类完成从访问到返回结果的XML解析部分,如果该结果不能被解析为XML,则弹出包含该结果的警告而停止运行,因此在调用parseHandle参数中的句柄的时候表明该XML文档正常
K_XmlLoaderK_XmlLoader使用到了一个简单的函数K_Function.K_GetCallBack,因此,使用时必须包含该函数才能运行
K_XmlLoader的构造函数有1个参数
parseHandle | 指出当XML加载完成后,进行XML处理的函数句柄,该句柄被调用的时候以K_XmlLoader对象本身做参数,因此,可以使用K_XmlLoader的xmlDoc属性来访问xml结果 |
K_XmlLoader只有一个Load方法
Load | 加载XML文件或访问WebService,有2个参数,url是XML或WebService路径,postData(可选)是WebService发送的数据 |
以下是该类的定义源码:
function K_XmlLoader(parseHandle) { this.parseHandle=parseHandle; this.xmlhttp =null; } K_XmlLoader.prototype.Load=function(url,postData) { this.url=url; this.xmlhttp =GXmlHttp.create(); var method="GET"; if(postData && postData.length>0) method="POST"; this.xmlhttp.open(method,this.url,true); this.xmlhttp.onreadystatechange=K_Function.GetCallBack(this,this.ParseXmlFile); if(postData && postData.length>0) { this.xmlhttp.setRequestHeader ("Content-Type","text/xml; charset=utf-8"); this.xmlhttp.setRequestHeader ("SOAPAction","\"\""); } this.xmlhttp.send(postData); } K_XmlLoader.prototype.ParseXmlFile=function() { if(this.xmlhttp==null || this.xmlhttp.readyState!=4) return; this.xmlDoc = this.xmlhttp.responseXML; if(this.xmlDoc.documentElement==null && this.xmlhttp.responseText && this.xmlhttp.responseText!="") { try{this.xmlDoc=GXml.parse(this.xmlhttp.responseText);} catch(ce){} } if(this.xmlDoc.documentElement==null) this.responseText=this.xmlhttp.responseText; this.xmlhttp=null; if(this.parseHandle) this.parseHandle.call(null,this); GEvent.trigger(this,"loaded",this); }
以下是一个使用范例:
var url=window.prompt('Xml File Path:','12.data.xml'); var xmlLoader=new K_XmlLoader(ReadXml); xmlLoader.Load(url,data); function ReadXml(xl) { alert(xl.xmlDoc.xml); var markers = xl.xmlDoc.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var point = new GPoint(parseFloat(markers[i].getAttribute("lng")), parseFloat(markers[i].getAttribute("lat"))); var marker =new GMarker(point); map.addOverlay(marker); } }查看范例(K_XmlLoader.html)
K_JsLoader(远程加载并运行一个JS文件)
K_JsLoader 远程加载并运行一个JS文件,当完成后,调用传入的句柄,如果要返回值,请在该JS文件之中给变量window._OLR赋值,该值就将会被作为参数传递给处理函数
K_JsLoaderK_LoadJS使用到了一个简单的函数K_Function.K_GetCallBack,因此,使用时必须包含该函数才能运行
K_JsLoader的构造函数有1个参数
parseHandle | 指出当XML加载完成后,进行XML处理的函数句柄,该句柄被调用的时候以K_XmlLoader对象本身做参数,因此,可以使用K_XmlLoader的xmlDoc属性来访问xml结果 |
K_XmlLoader只有一个load方法
load(url) | 加载指定URL的JS文件,参数url为文件路径 |
以下是该类的定义源码:
function K_JsLoader(parseHandle) { this.parseHandle=parseHandle; } K_JsLoader.prototype.load=function(src) { if(!this.jsFile) { this.jsFile=document.createElement("script"); this.jsFile.type="text/javascript"; this.jsFile.defer=true; document.body.insertBefore(this.jsFile,document.body.firstChild); GEvent.bindDom(this.jsFile,"readystatechange",this,this.onReadyStateChange); GEvent.bindDom(this.jsFile,"load",this,this.onLoad); } this.jsFile.src=src; this.running=true; } K_JsLoader.prototype.onLoad=function(e) { if(window._OLR) { GEvent.trigger(this,"loaded",K_JsLoader.parseObject(window._OLR)); if(this.parseHandle) this.parseHandle.call(null,window._OLR); } else { GEvent.trigger(this,"error"); } window._OLR=null; if(!document.all && this.jsFile && this.jsFile.parentNode==document.body) { this.jsFile.removeAttribute("src"); document.body.removeChild(this.jsFile); delete this.jsFile; } this.running=false; } K_JsLoader.parseObject=function(obj) { return obj; } K_JsLoader.prototype.onReadyStateChange=function(e) { if(!this.jsFile || this.jsFile.readyState!="loaded") { return; } this.onLoad(); } K_JsLoader.getChild=function(arr,name) { for(var i=0;i< arr.childNodes.length;i++) { if(arr.childNodes[i].name==name) { return arr.childNodes[i]; } } }
以下是一个使用范例:
var url=window.prompt('Xml File Path:','12.data.xml'); var xmlLoader=new K_XmlLoader(ReadXml); xmlLoader.Load(url,data); function ReadXml(xl) { alert(xl.xmlDoc.xml); var markers = xl.xmlDoc.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var point = new GPoint(parseFloat(markers[i].getAttribute("lng")), parseFloat(markers[i].getAttribute("lat"))); var marker =new GMarker(point); map.addOverlay(marker); } }查看范例(K_JsLoader.html)
K_UserPosition(根据IP显示用户所在地理位置的类)
K_UserPosition是一个使用Microsoft VE控件获取用户所在位置的类,如果用户已经安装VE控件,则返回VE控件记录的地理位置(由用户自己选择位置),否则则直接使用IP,并通过Microsoft的JS文件实现IP到地理经纬度的转换。
K_UserPosition的构造函数没有参数,并且只有一个Load方法
Load | 调用该方法后开始载入用户地理位置,handle参数是当获取地理位置成功之后以该K_UserPosition为对象调用的方法,该方法可以使用point(代表位置经纬度的GLatLng),zoom(代表该位置最合适的缩放级别)两个属性. |
该控件使了一个函数K_LoadJS来载入JS文件,因此,必须包含本函数,该类才能正常使用
以下是该类的定义源码:
//这是调用用户所在地点的对象 function K_UserPosition() { this.loaded=false; } K_UserPosition.prototype.Load=function(handle) { this.handle=handle; this.LoadByWiFi(); } K_UserPosition.prototype.LoadByWiFi=function() { var wifi=this.GetWiFiControl(); if(wifi) { try { var results = wifi.GetLocation(); if(results&&results.length>0) {eval(results);return;} } catch(ex){} } window.SetAutoLocateViewport=K_Function.GetCallBack(this,this.SetAutoLocateViewport); window.ShowMessage=K_Function.GetCallBack(this,this.ShowMessage); new K_JsLoader().load("http://virtualearth.msn.com/WiFiIPService/locate.ashx?pos="); } K_UserPosition.prototype.GetWiFiControl=function() { var wifi=null; try { wifi=new ActiveXObject("WiFiScanner"); } catch(e) { try { wifi=new ActiveXObject("Microsoft.MapPoint.WiFiScanner.1"); } catch(e) { try { wifi=new WiFiScanner("Microsoft.MapPoint.WiFiScanner.1"); } catch(e) {} } } return wifi; } K_UserPosition.prototype.ShowMessage=function(message) { } K_UserPosition.prototype.SetAutoLocateViewport=function(lat,lon,zoom,pin,message) { if(this.loaded) return; this.point=new GLatLng(lat,lon); this.zoom=17-zoom; this.pin=pin; this.message=message; this.loaded=true; if(this.handle) { this.handle.apply(this); this.handle=null; } }
以下是一个使用范例:
var userPosition=new K_UserPosition(); userPosition.Load(function(){ map.setCenter(this.point,this.zoom); var marker=new GMarker(this.point); map.addOverlay(marker); GEvent.addListener(marker,"click",function(){marker.openInfoWindowHtml('You Position');}); });查看范例(K_UserPosition.html)
K_MSOPEncryptPointSrv(使用MOSP的EncryptPoint服务进行灵图数据加密的对象)
K_MSOPEncryptPointSrv灵图的使用的经纬度坐标大约是经纬度坐标乘以100000的坐标,可是毕竟只是大约,所以需要进行精确的转换,就要使用本对象
K_MSOPEncryptPointSrv定义之中使用到了K_JsLoader,因此,使用时必须包含这些内容才能运行
K_MSOPEncryptPointSrv的构造函数有1个参数
handle | 用来处理加密结果的句柄,当加密完成得到结果后,该句柄被调用,以加密结果做参数 |
K_MSOPEncryptPointSrv提供一个方法
EncryptPoint(points) | 调用该方法后开始进行异步的数据加密,参数是一个GLatLng数组,包含待加密的点数据 ,加密的结果在以一个二维数组的格式发送给加密结果处理函数. |
以下是该类的定义源码:
function K_MSOPEncryptPointSrv(handle) { this.handle=handle; this.loader=new K_JsLoader(); GEvent.bind(this.loader,"loaded",this,this.onLoad); } K_MSOPEncryptPointSrv.prototype.EncryptPoint=function(points,handle) { if(handle){this.handle=handle;} var str="http://www.step1.cn/51Ditu/Services/JsEP.aspx?"; for(var i=0;i< points.length;i++) { str+=parseInt(points[i].lng()*100000)+","+parseInt(points[i].lat()*100000)+";"; } str=str.substring(0,str.length-1); this.loader.load(str); } K_MSOPEncryptPointSrv.prototype.onLoad=function(resultObj) { GEvent.trigger(this,"end",resultObj); if(this.handle){this.handle.apply(this,[resultObj]);} }
以下是一个使用范例:
var map,eps,point; function onLoad() { map = new GMap2(document.getElementById("map")); map.setCenter(new GLatLng(36.94989178681327,106.083984375),6); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); eps=new K_MSOPEncryptPointSrv(SetInfo); ChangeInfo(); GEvent.addListener(map,"moveend",ChangeInfo); } function ChangeInfo() { point=map.getCenter(); eps.EncryptPoint([point]); } function SetInfo(points) { html='The Latlng of Center:('+point.lng()+','+point.lat()+') '; html=html+'The MOSP coordinate of Center:('+points[0][0]+','+points[0][1]+')'; document.getElementById("Info").innerHTML=html; }查看范例(K_MSOPEncryptPointSrv.html)
K_MSOPGeoCodeSrv(使用MOSP的GeoCodeSrv服务载入灵图的地理编码信息对象)
K_MSOPGeoCodeSrv根据灵图的服务,进行从经纬度到地理信息的查询,例如,根据经纬度(114.11465,22.56203)得到的查询结果是:"广东省深圳市罗湖区洪湖西路和洪湖东路交叉口东北321米处,湖景花园西北97米处"。
K_MSOPGeoCodeSrv定义之中使用到了K_JsLoader
K_MSOPGeoCodeSrv的构造函数有1个参数
handle | 每次得到查询结果后运行的句柄,该句柄被调用的时候以K_MSOPGeoCodeSrv对象本身做参数,因此,可以使用K_MSOPGeoCodeSrv的status(查询状态)属性和result(查询结果字符串)属性来访问查询结果,有以下几种状态值: -2: 地理信息查询发生错误 -1: 超出可查询范围 0: 没有开始地理信息查询 1: 正在查询 2: 查询完成,结果正常 |
K_MSOPGeoCodeSrv提供一个方法
GetGeoCode(latlng) | 调用该方法后开始进行地理编码查询,参数是代表该位置的一个GLatLng. |
以下是该类的定义源码:
function K_MSOPGeoCodeSrv(handle) { this.handle=handle; this.status=0; this.loader=new K_JsLoader(); GEvent.bind(this.loader,"loaded",this,this.onLoad); } K_MSOPGeoCodeSrv.prototype.GetGeoCode=function(point) { if(73.12667>point.lng() || point.lng()>135.21180 || 18.12810>point.lat() || point.lat()>55.15600) { this.status=-1; this.handle.apply(this); return; } this.status=1; this.point=point; var str="http://www.step1.cn/51Ditu/Services/GeoCodeSrv.aspx?lng="+point.lng()+"&lat="+point.lat(); this.loader.load(str); } K_MSOPGeoCodeSrv.prototype.onLoad=function(resultObj) { this.result=decodeURI(resultObj.result).replace(/%2c/gim," "); this.status=2; GEvent.trigger(this,"end",this); if(this.handle){this.handle.call(null,this);} }
以下是一个使用范例:
autoGeoCode=new K_MSOPGeoCodeSrv(SetGeoCodeInfo); GEvent.addListener(map,"moveend",function(){autoGeoCode.GetGeoCode(map.getCenter());}); autoGeoCode.GetGeoCode(map.getCenter()); function SetGeoCodeInfo(geoCode) { if(geoCode.status==2) document.getElementById("Info").innerHTML=geoCode.result; }查看范例(K_MSOPGeoCodeSrv.html)
<!----><!---->
相关推荐
重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144929660 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!
2024年AI代码平台及产品发展简报-V11
蓝桥杯算法学习冲刺(主要以题目为主)
QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调; FPGA设计; 详细实验文档,基于QPSK调制的FPGA设计与实验文档
PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研究,PID, ADRC和MPC轨迹跟踪控制器Simulink仿真模型。 MPC用于跟踪轨迹 ADRC用于跟踪理想横摆角 PID用于跟踪轨迹 轨迹工况有双移线,避障轨迹,正弦轨迹多种 matlab版本为2018,carsim版本为8 ,PID; ADRC; MPC; 轨迹跟踪控制器; Simulink仿真模型; 双移线; 避障轨迹; 正弦轨迹; MATLAB 2018; CarSim 8,基于Simulink的PID、ADRC与MPC轨迹跟踪控制器仿真模型研究
重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144486173 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!
内容概要:本文档详细介绍了一个利用Matlab实现Transformer-Adaboost结合的时间序列预测项目实例。项目涵盖Transformer架构的时间序列特征提取与建模,Adaboost集成方法用于增强预测性能,以及详细的模型设计思路、训练、评估过程和最终的GUI可视化。整个项目强调数据预处理、窗口化操作、模型训练及其优化(包括正则化、早停等手段)、模型融合策略和技术部署,如GPU加速等,并展示了通过多个评估指标衡量预测效果。此外,还提出了未来的改进建议和发展方向,涵盖了多层次集成学习、智能决策支持、自动化超参数调整等多个方面。最后部分阐述了在金融预测、销售数据预测等领域中的广泛应用可能性。 适合人群:具有一定编程经验的研发人员,尤其对时间序列预测感兴趣的研究者和技术从业者。 使用场景及目标:该项目适用于需要进行高质量时间序列预测的企业或机构,比如金融机构、能源供应商和服务商、电子商务公司。目标包括但不限于金融市场的波动性预测、电力负荷预估和库存管理。该系统可以部署到各类平台,如Linux服务器集群或云计算环境,为用户提供实时准确的预测服务,并支持扩展以满足更高频率的数据吞吐量需求。 其他说明:此文档不仅包含了丰富的理论分析,还有大量实用的操作指南,从项目构思到具体的代码片段都有详细记录,使用户能够轻松复制并改进这一时间序列预测方案。文中提供的完整代码和详细的注释有助于加速学习进程,并激发更多创新想法。
液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂。 该案例是文献复现,文献与案例一起。 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破裂:障碍挑战的文献复现案例
蓝桥杯算法学习冲刺(主要以题目为主)
蓝桥杯算法学习冲刺(主要以题目为主)
基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升。,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提升模型精度和鲁棒性,基于变预测时域的MPC自适应轨迹跟踪控制,针对轮胎刚度时变的特点造成控制模型精度降低,基于最小递归二乘法(RLS)估算的轮胎侧偏刚度,提升了模型的控制精度和鲁棒性,通过carsim与simulink联合仿真结果发现,改进后的轨迹跟踪控制器既满足了车辆低速行驶下的轨 迹跟踪精度,也一定程度上克服了高速下车辆容易失去稳定性的问题。 有详细的lunwen分析说明和资料,以及本人的,仿真包运行。 ,基于变预测时域的MPC; 自适应轨迹跟踪控制; 轮胎刚度时变; 控制模型精度降低; 最小递归二乘法(RLS)估算; 模型控制精度和鲁棒性提升; carsim与simulink联合仿真; 轨迹跟踪控制器; 车辆稳定性。,基于变预测时域MPC的轮胎刚度自适应轨迹跟踪控制策略研究
GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计; 详细实验文档; 实验结果分析,GMSK调制解调技术:FPGA设计与实验详解
# 基于Arduino和Python的Cansat卫星系统 ## 项目简介 本项目是一个Cansat卫星系统,旨在设计和实现一个小型卫星模型,通过火箭发射至1公里高空,并使用地面站接收其传输的数据。项目涉及Arduino编程、Python数据处理和可视化。 ## 主要特性和功能 1. 硬件组件 使用Arduino Nano作为Cansat的微控制器。 搭载BMP 280温度和压力传感器、ATGM336H GPS模块、LoRa通信模块等。 地面站使用Arduino Uno和LoRa通信模块接收数据。 2. 数据处理 使用Python进行数据处理和可视化,包括数据清洗、计算风速、绘制温度、压力、风速和海拔随时间变化的图表等。 3. 通信与控制 通过LoRa模块实现Cansat与地面站之间的数据传输。 提供实时监视和记录数据的脚本。 ## 安装和使用步骤 ### 1. 硬件准备
U9300C 龙尚4G模块安装后模块才能正常使用,win7 win10驱动程序,支持USB转接板。
# 基于Arduino平台的物联网温湿度监控系统 ## 项目简介 这是一个基于Arduino平台的物联网温湿度监控项目,旨在通过简单的硬件设备实现环境数据的实时监测与远程管理。该项目适用于智能家居、农业种植等领域。 ## 项目的主要特性和功能 1. 温湿度数据采集通过Arduino板连接温湿度传感器,实时采集环境数据。 2. 数据传输将采集到的数据通过无线网络模块发送到服务器或远程终端。 3. 数据可视化可在电脑或移动设备端展示实时的温湿度数据。 4. 报警功能当温湿度数据超过预设阈值时,自动触发报警通知。 ## 安装使用步骤 前提假设用户已经下载了本项目的源码文件。以下是简单明了的安装使用步骤 1. 环境准备安装Arduino开发环境,配置必要的硬件接口。 2. 硬件连接将Arduino板与温湿度传感器、无线网络模块连接。 3. 代码上传将本项目提供的Arduino代码上传至Arduino板。
基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求响应的配电网重构(matlab代码) 该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》,以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标,针对配电网重构模型的非凸性,引入中间变量并对其进行二阶锥松弛,构建混合整数凸规划模型,采用改进的 IEEE33 节点配电网进行算例仿真,分析了需求响应措施和清洁能源渗透率对配电网重构结果的影响。 该程序复现效果和出图较好(详见程序结果部分),注释清楚,方便学习 ,高比例清洁能源; 需求响应; 配电网重构; 二阶锥松弛; 综合成本最小化; MATLAB代码; IEEE33节点配电网; 复现效果; 出图; 注释清楚。,Matlab代码复现:高比例清洁能源接入下的配电网重构模型与需求响应分析
# 基于C++的RapidJSON库测试项目 ## 项目简介 本项目是一个基于C++的RapidJSON库测试项目,主要用于测试RapidJSON库的功能正确性、性能以及稳定性。RapidJSON是一个高效的C++ JSON解析生成库,广泛应用于各种场景。本项目通过编写一系列的单元测试,覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以确保RapidJSON库在各种情况下都能正确、稳定地工作。 ## 项目的主要特性和功能 1. 单元测试框架使用Google Test测试框架进行单元测试,确保测试的可靠性和可扩展性。 2. 全面测试覆盖覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以及针对各种输入数据的测试。 3. 性能测试通过性能基准测试,评估RapidJSON库在处理不同规模和类型的JSON数据时的性能表现。
蓝桥杯算法学习冲刺(主要以题目为主)
内容概要:本文详细介绍如何安装和初步使用 VMware 虚拟机,从下载安装 VMware 到创建和配置新的虚拟机。主要内容包括:软件选择和安装步骤、虚拟机的新建配置、操作系统安装及初始化设置、安装 VMware Tools 提升性能以及一些常用的 VMWare 功能,如虚拟网络的不同连接方式及其应用场景。同时介绍了 VMware 软件在网络连接管理和服务配置方面的一些要点,确保虚拟机正常运行。 适用人群:计算机操作较为熟练、有意搭建不同操作系统测试环境的技术人员,以及想要了解虚拟机基本概念及应用的学生。 使用场景及目标:适合于个人用户进行系统兼容性和安全性的验证;适用于企业或开发者做软件测试、模拟复杂环境下作业,确保不影响宿主机正常工作的前提下完成多种任务;适用于教学培训环境中部署实验平台。此外,还可以用来隔离特定业务流程(比如银行工具)、探索不同类型操作系统的特点。 其他说明:需要注意的是,为了避免安装过程中出现问题,建议暂时关闭杀毒软件和防火墙。安装 VMware 需要接受许可协议,同时可以选择安装路径和安装类型(典型/自定义)。最后,对于网络设置,默认提供的三种模式——桥接模式、仅主机模式和 NAT 模式,可以帮助用户根据不同需求灵活调整网络连接方式。
java毕业设计源码