技术标签: cesium
白驹过隙,时光如梭,又到一年年尾。回想一年的工作,感觉做了很多,又感觉什么都没做成。so,在此回顾一下今年经历过的那些个不一定有头,不一定有尾的项目经历。今天讲讲Cesium。
我是个随性的人,想到哪里讲到哪里,但是逻辑还是很清晰的,细节即是如此。
Cesium是一个很强大的3D框架,很多大公司的底层框架都基于此。so自己实践做了一些实验,对Cesium做了比较详细的了解,并简单实现了测面、测距、加载各种格式的数据(.geojson 3Dtile .kml .czml等格式)。废话不多说,具体了解一下。
首先是Cesium开发包的引入,直接在Cesium的官网上下载就好了,然后新建的项目在项目的Apps里面存放即可。
头部导入.js类
<!-- script部分 -->
<script src="../../../Build/Cesium/Cesium.js"></script>
初始化Cesium界面
var viewer = new Cesium.Viewer('map_container', {
animation: false,
baseLayerPicker: false,
geocoder: true,
timeline: false,
sceneModePicker: true,
navigationHelpButton: false,
infoBox: true,
fullscreenButton:false,
vrButton:true,
homeButton:false,
selectionIndicator : false,//是否显示选取指示器组件
});
viewer._cesiumWidget._creditContainer.style.display = "none"; //去掉左下角那个不可爱的图标
// viewer.extend(Cesium.viewerCesiumInspectorMixin); //那些个特效
viewer.camera.setView({
destination:Cesium.Cartesian3.fromDegrees(111.07, 39.05, 20000000),
orientation:{
heading : Cesium.Math.toRadians(0),
pitch : Cesium.Math.toRadians(-90),
roll : Cesium.Math.toRadians(0) //heading、pitch和roll就是镜头相对于xyz轴的角度,比如pitch为-90°而另外两个为0时,就是90°向下俯视地球。
}
});
new操作的时候,后面{}里面的item都是可选的,改成true or false都可以,都是些特效类,玩腻了,除了必要的,都不要了,例如baselayerPicker底图选择器,里面包含多种数据源(google的啦,bingMap)
加载底图(天地图的,找了好久才找到)
var layerone = viewer.scene.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({
url: "http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles",
layer: "tdtImgBasicLayer",
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: false
}));//卫星影像
// layerone.alpha = 0.3;
// layerone.brightness = 2.0;
var layertwo = viewer.scene.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({
url: "http://t0.tianditu.com/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles",
layer: "tdtImgAnnoLayer",
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: false
}));//注记图层
加载数据,不具体去分开了,因为我自己代码就是写在一起的,来个大集合,.geojson、.KML、tileset.json(3Dtile数据)
3Dtile是什么格式?该知道的总会知道,Cesium加载3Dtile
var URL_MODEL = "/officalCesium/Apps/baseData/";
$('#upLoadFile').change(function () {
var file = $('#upLoadFile').get(0).files[0];
var filename = file.name;
var t = filename.lastIndexOf(".");
var s = filename.substring(t+1,filename.length).toUpperCase();
var dataType = document.getElementById("typeInput");
var value = dataType.options[dataType.selectedIndex].value.toUpperCase();
$('#addLayerModal').modal('hide'); //隐藏对话框
if(s == value){
if(value == "GEOJSON"){
var filepath = URL_MODEL+filename;
var geosonView = viewer.dataSources.add(Cesium.GeoJsonDataSource.load(filepath,{
stroke: Cesium.Color.YELLOW, //设置为TRANSPARENT的时候,透明
fill: Cesium.Color.YELLOW,
strokeWidth: 5,
markerSymbol: '?',
}));
viewer.flyTo(geosonView);
// alert(filepath+"");
}
else if (value == "JSON" && filename.toUpperCase() == "TILESET.JSON"){
var filepath = URL_MODEL+filename;
var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
url: filepath, //数据路径
maximumScreenSpaceError: 2,//默认16,最大屏幕空间错误
//maximumNumberOfLoadedTiles: 1000,
maximumMemoryUsage:1024//默认512,内存MB的最大数量
}));
viewer.flyTo(tileset);
// alert(filepath+"");
}
else if(value == "KML"){
var filepath = URL_MODEL+filename;
var kml_view = Cesium.KmlDataSource.load(filepath);
viewer.flyTo(kml_view);
// alert(filepath+"");
}else if(value == "CZML"){
var filepath = URL_MODEL+filename;
var dataRecourse = new Cesium.CzmlDataSource(filepath);
dataRecourse.load();
viewer.dataSources.add(dataRecourse);
viewer.flyTo(data_resouce);
}
}else {
alert("上传失败,不是."+value+"类型的文件");
}
});
飞行、复位等实用工具如下:
//飞行到某个点
function dingwei(lon,lat,height){
viewer.camera.flyTo({
destination : Cesium.Cartesian3.fromDegrees(lon,lat,height), // 设置位置
orientation: {
heading : Cesium.Math.toRadians(20.0), // 方向
pitch : Cesium.Math.toRadians(-90.0),// 倾斜角度
roll : 0
},
duration:5, // 设置飞行持续时间,默认会根据距离来计算
complete: function () {
// 到达位置后执行的回调函数
console.log('到达目的地');
},
cancle: function () {
// 如果取消飞行则会调用此函数
console.log('飞行取消')
},
pitchAdjustHeight: -90, // 如果摄像机飞越高于该值,则调整俯仰俯仰的俯仰角度,并将地球保持在视口中。
maximumHeight:500, // 相机最大飞行高度
flyOverLongitude: 100, // 如果到达目的地有2种方式,设置具体值后会强制选择方向飞过这个经度
});
}
//复位地图
function clearMap(){
// dingwei(115.446105254,22.771558650,2000);
viewer.flyTo(tileset);
clearAllPan();
}
//清空地图
function clearAll(){
clearAllPan();
}
然后就是测距测面,测量分两种吧,一直贴地的,一种是3D的那种,贴地量算没问题,3D的我写的代码还是有问题。
//* 测距测面 */
var scene = viewer.scene;
var canvas = viewer.canvas;
var clock = viewer.clock;
var camera = viewer.scene.camera;
//布尔型变量
var isPoint = false;
var isPolyline = false;
var isPolygon_line = false;
//是否开始绘制标识
var isStartDraw = false;
var isclear = false;
var points = viewer.entities.add(new Cesium.Entity());
var polylines = viewer.entities.add(new Cesium.Entity());
var Polygons_Line = viewer.entities.add(new Cesium.Entity());
//画多边形过程中展示的线最后要移除或者不显示
var Polygon_Lines_remove = viewer.entities.add(new Cesium.Entity());
var ellipsoid = scene.globe.ellipsoid;
canvas.onclick = function () {
canvas.focus();
};
var handler = new Cesium.ScreenSpaceEventHandler(canvas);
viewer.zoomTo(viewer.entities);
defaultZoomAmount_ = 3000000.0;
var lastPointLon = -999.0;
var lastPointLat = -999.0;
var firstPointLon = -999.0;
var firstPointLat = -999.0;
var measurePointsArray=new Array();
measurePointsArray.splice(0,measurePointsArray.length);
var endCartographic = new Cesium.Cartographic();
var geodesic = new Cesium.EllipsoidGeodesic();
var PolygonPointArray_line = null;
var PolygonPointArray_fill = null;
//鼠标移动时的那条线
var moveLine_first = viewer.entities.add({
id: "moveLine_first",
name: 'line on the surface',
polyline: {
show: false,
width: 2,
material: Cesium.Color.WHITE
}
});
var moveLine_second = viewer.entities.add({
id: "moveLine_second",
name: 'line on the surface',
polyline: {
show: false,
width: 2,
material: Cesium.Color.WHITE
}
});
/* handler.setInputAction(function(){},
Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);*/
//鼠标移动时做的操作
handler.setInputAction(function (movement) {
//捕获椭球体,将笛卡尔二维平面坐标转为椭球体的笛卡尔三维坐标,返回球体表面的点
var cartesian=viewer.camera.pickEllipsoid(movement.endPosition, ellipsoid);
if(cartesian) {
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
//将地图坐标(弧度)转为十进制的度数
var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(4);
var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(4);
var alti_String = (viewer.camera.positionCartographic.height / 1000).toFixed(2);
longitude_show.innerHTML = log_String;
latitude_show.innerHTML = lat_String;
altitude_show.innerHTML = alti_String;
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
function clearAllPan() {
viewer.entities.removeAll();
isStartDraw = false;
isclear = true;
document.body.style.cursor = "pointer";
document.getElementById("map_container").style.cursor = "pointer";
handler.setInputAction(function(){
},Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
var QQ=0;
function clearAllPan1(id) {
if(id!=undefined){
var tempmark = viewer.entities.getById(id);
viewer.entities.remove(tempmark);
}
QQ=1;
}
//双击停止加线面
function shuangji(){
isPolyline = false;
isPolygon_line = false;
isPolygon_fill = false;
isStartDraw = false;
}
//加点
function addPoint() {
isPoint = true;
isPolyline = false;
isPolygon_line = false;
isPolygon_fill = false;
isStartDraw = false;
QQ=0;
}
//加线
function measureLength() {
var select_measure = document.getElementById("selOpt");
var value_measure = select_measure.options[select_measure.selectedIndex].value;
if(value_measure == 2){
isPoint = false;
isPolyline = true;
isPolygon_line = false;
isPolygon_fill = false;
isStartDraw = false;
QQ=0;
document.body.style.cursor = "url(resource/pic/icons/magnifier3.cur) 12 12,crosshair";
document.getElementById("map_container").style.cursor = "url(resource/pic/icons/magnifier3.cur) 12 12,crosshair";
addOnClickListener();
}
}
function addOnClickListener(){
handler.setInputAction(function(){},
Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
//鼠标移动时做的操作
handler.setInputAction(function (movement) {
if (isPolyline || isPolygon_line ) {
var cartesian = viewer.camera.pickEllipsoid(movement.endPosition, scene.globe.ellipsoid);
if (cartesian && isStartDraw) {
//做清除工作把全局变量moveLine清除掉了 ,需要重新加到entities上 否则显示不正常
if (isclear) {
viewer.entities.add(moveLine_first);
viewer.entities.add(moveLine_second);
isclear = false;
}
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var curMovementLon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(12);
var curMovementLat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(12);
viewer.entities.getById("moveLine_first").polyline.positions = Cesium.Cartesian3.fromDegreesArray([lastPointLon, lastPointLat ,curMovementLon,
curMovementLat]);//修改属性
viewer.entities.getById("moveLine_first").polyline.show = true;
if (PolygonPointArray_line != null) {
if (PolygonPointArray_line.length >= 3) {
viewer.entities.getById("moveLine_second").polyline.positions = Cesium.Cartesian3.fromDegreesArray([curMovementLon, curMovementLat, firstPointLon, firstPointLat]);//修改属性
viewer.entities.getById("moveLine_second").polyline.show = true;
}
}
}
}
//捕获椭球体,将笛卡尔二维平面坐标转为椭球体的笛卡尔三维坐标,返回球体表面的点
var cartesian=viewer.camera.pickEllipsoid(movement.endPosition, ellipsoid);
if(cartesian){
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic=viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
//将地图坐标(弧度)转为十进制的度数
var lat_String=Cesium.Math.toDegrees(cartographic.latitude).toFixed(4);
var log_String=Cesium.Math.toDegrees(cartographic.longitude).toFixed(4);
var alti_String=(viewer.camera.positionCartographic.height/1000).toFixed(2);
longitude_show.innerHTML=log_String;
latitude_show.innerHTML=lat_String;
altitude_show.innerHTML=alti_String;
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
//鼠标左击做的操作
handler.setInputAction(function (click) {
if(QQ==1){
var pickedObject = viewer.scene.pick(click.position);
if (Cesium.defined(pickedObject) && (pickedObject.id != undefined)) {
actEntity = pickedObject.id;
clearAllPan1(actEntity._id);
}
}
if (isPoint || isPolyline || isPolygon_line ) {
var cartesian = viewer.camera.pickEllipsoid(click.position, scene.globe.ellipsoid);
if (cartesian) {
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var currentClickLon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(12);
var currentClickLat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(12);
/* var currentClickHeight = cartographic.height;
console.log(currentClickHeight); */
if (!isStartDraw) {
viewer.entities.add({
position: cartesian,
point: {
parent: points,
pixelSize: 5,
color: Cesium.Color.YELLOW
}
});
firstPointLon = currentClickLon;
firstPointLat = currentClickLat;
PolygonPointArray_line = null;
PolygonPointArray_fill = null;
measurePointsArray.splice(0,measurePointsArray.length);
// var startCartographic = Cesium.Cartographic.fromDegrees(firstPointLon, firstPointLat);
measurePointsArray.push(cartographic);
isStartDraw = true;
} else {
if (isPoint) {
viewer.entities.add({
position: cartesian,
point: {
parent: points,
pixelSize: 5,
color: Cesium.Color.YELLOW
}
});
}
if (isPolyline || isPolygon_line )
{
// endCartographic = Cesium.Cartographic.fromDegrees(currentClickLon, currentClickLat,currentClickHigh);
endCartographic = Cesium.Cartographic.fromDegrees(currentClickLon, currentClickLat);
console.log(endCartographic);
measurePointsArray.push(endCartographic);
var arrLength=measurePointsArray.length;
var tmpDis=0;
var sumDis=0;
for(var i=1;i<arrLength;i++)
{
geodesic.setEndPoints(measurePointsArray[i-1], measurePointsArray[i]);
tmpDis=Math.round(geodesic.surfaceDistance);
sumDis=sumDis+tmpDis;
}
if(sumDis>1000)
{
var polylineDis= (sumDis / 1000).toFixed(1) + " km";
}
else{
var polylineDis= sumDis + " m";
}
// console.log(dis);
viewer.entities.add({
parent: polylines,
polyline: {
// positions: Cesium.Cartesian3.fromDegreesArray([lastPointLon, lastPointLat,lastPointHigh, currentClickLon, currentClickLat,currentClickHigh]),
positions: Cesium.Cartesian3.fromDegreesArray([lastPointLon, lastPointLat, currentClickLon, currentClickLat]),
width: 2,
material: Cesium.Color.RED
},
label: {
text: polylineDis.toString(),
font: '20px SimHei ',
Width: 10,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
fillColor: Cesium.Color.YELLOW,
outlineColor : Cesium.Color.GRAY,
outlineWidth :5,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
/* label : {
// This callback updates the length to print each frame.
text: polylineDis.toString(),
font : '25px',
pixelOffset : new Cesium.Cartesian2(1, 20)
},*/
// position: Cesium.Cartesian3.fromDegrees(currentClickLon, currentClickLat,currentClickHigh)
position: Cesium.Cartesian3.fromDegrees(currentClickLon, currentClickLat)
});
viewer.entities.getById("moveLine_first").polyline.show = false;
viewer.entities.getById("moveLine_second").polyline.show = false;
}
}
//记录鼠标点击的当前位置 作为下一次画线的起始点位置
lastPointLon = currentClickLon;
lastPointLat = currentClickLat;
// lastPointHigh = currentClickHigh;
if (isPolygon_line) {
if (PolygonPointArray_line == null)
PolygonPointArray_line = new Array();
PolygonPointArray_line.push(currentClickLon);
PolygonPointArray_line.push(currentClickLat);
// PolygonPointArray_line.push(currentClickHigh);
}
}
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
//鼠标双击时做的操作
handler.setInputAction(function (click)
{
if (isPolyline || isPolygon_line )
{
var cartesian = viewer.camera.pickEllipsoid(click.position, scene.globe.ellipsoid);
if (cartesian && isStartDraw)
{
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var endPointLon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(12);
var endPointLat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(12);
var endPointHigh = Cesium.Math.toDegrees(cartographic.height).toFixed(12);
measurePointsArray.push(cartographic);
var arrLength=measurePointsArray.length;
var tmpDis=0;
var sumDis=0;
for(var i=1;i<arrLength;i++)
{
geodesic.setEndPoints(measurePointsArray[i-1], measurePointsArray[i]);
tmpDis=Math.round(geodesic.surfaceDistance);
sumDis=sumDis+tmpDis;
}
//考虑多边形最后显示距离
geodesic.setEndPoints(measurePointsArray[0], measurePointsArray[arrLength-1]);
tmpDis=Math.round(geodesic.surfaceDistance);
sumDis1=sumDis+tmpDis;
if(sumDis>1000)
{
var polylineDis= (sumDis / 1000).toFixed(1) + " km";
var polygonDis = (sumDis1 / 1000).toFixed(1) + " km";
}
else{
var polylineDis= (sumDis) + " m";
var polygonDis = (sumDis1) + " m";
}
if (isPolyline || isPolygon_line )
{
//画末线段
viewer.entities.add({
name: 'line on the surface',
parent: polylines,
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([lastPointLon, lastPointLat, endPointLon, endPointLat]),
width: 5,
material: Cesium.Color.RED
},
label: {
text: polylineDis.toString(),
font: '20px SimHei ',
Width: 10,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
fillColor: Cesium.Color.YELLOW,
outlineColor : Cesium.Color.GRAY,
outlineWidth :5,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
/*label : {
// This callback updates the length to print each frame.
text: polylineDis.toString(),
font : '25px',
pixelOffset : new Cesium.Cartesian2(1, 20)
},*/
position: Cesium.Cartesian3.fromDegrees(endPointLon, endPointLat)
});
if ( isPolygon_line )
{
viewer.entities.add({
name: 'line on the surface',
parent: polylines,
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([endPointLon, endPointLat, firstPointLon, firstPointLat]),
width: 5,
material: Cesium.Color.RED
}
});
viewer.entities.getById("moveLine_second").polyline.show = false;
}
viewer.entities.getById("moveLine_first").polyline.show = false;
}
//画多边形 不带填充
if (isPolygon_line)
{
if (PolygonPointArray_line != null) {
PolygonPointArray_line.push(endPointLon);
PolygonPointArray_line.push(endPointLat);
}
//当多边形数组中点的个数大于等于3时添加多边形
if (PolygonPointArray_line.length >= 3) {
viewer.entities.add({
name: 'polygon on surface',
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray(PolygonPointArray_line),
material: Cesium.Color.RED,
fill: false, //不显示填充
outline: true,
outlineWidth: 5.0,
outlineColor: Cesium.Color.RED
},
label: {
text: polygonDis.toString(),
font: '20px SimHei ',
Width: 10,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
fillColor: Cesium.Color.YELLOW,
outlineColor : Cesium.Color.GRAY,
outlineWidth :5,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
/* label : {
// This callback updates the length to print each frame.
text: polygonDis.toString(),
font : '25px',
pixelOffset : new Cesium.Cartesian2(1, 1)
},*/
position: Cesium.Cartesian3.fromDegrees(firstPointLon, firstPointLat)
});
}
PolygonPointArray_line = null;
viewer.entities.getById("moveLine_first").polyline.show = false;
viewer.entities.getById("moveLine_second").polyline.show = false;
}
isStartDraw = false;
}
}
}, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
}
//加多边形不带填充
function measureArea() {
var select_measure = document.getElementById("selOpt");
var value_measure = select_measure.options[select_measure.selectedIndex].value;
if(value_measure == 2){
isPoint = false;
isPolyline = false;
isPolygon_line = true;
isPolygon_fill = false;
isStartDraw = false;
QQ=0;
document.body.style.cursor = "url(resource/pic/icons/magnifier3.cur) 12 12,crosshair";
document.getElementById("map_container").style.cursor = "url(resource/pic/icons/magnifier3.cur) 12 12,crosshair";
addOnClickListener();
}
}
唔,大概主要功能就是这些了。给自己备忘,代码包我就不传了,如果有问题或者想了解更多的童鞋可以私信或者微我 ^V^
文章浏览阅读101次。4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始。2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量。1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。2.class允许继承、被继承,struct不允许,只能继承接⼝。3.Struct有性能优势,Class有⾯向对象的扩展优势。3.class可以初始化变量,struct不可以。1.class是引⽤类型,struct是值类型。
文章浏览阅读586次。想实现的功能是点击顶部按钮之后按关键字进行搜索,已经可以从服务器收到反馈的json信息,但从json信息的解析开始就会闪退,加载listview也不知道行不行public abstract class loadlistview{public ListView plv;public String js;public int listlength;public int listvisit;public..._rton转json为什么会闪退
文章浏览阅读219次。如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet
文章浏览阅读521次。系统项目报表导出 导出任务队列表 + 定时扫描 + 多线程_积木报表 多线程
文章浏览阅读1.1k次,点赞9次,收藏9次。使用AJAX技术的好处之一是它能够提供更好的用户体验,因为它允许在不重新加载整个页面的情况下更新网页的某一部分。另外,AJAX还使得开发人员能够创建更复杂、更动态的Web应用程序,因为它们可以在后台与服务器进行通信,而不需要打断用户的浏览体验。在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的响应和更好的用户体验。_ajax 获取http数据
文章浏览阅读2.8k次。登录退出、修改密码、关机重启_字符终端
文章浏览阅读3.8k次,点赞3次,收藏51次。前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!我先写了一个测试程序试了一下,OK!搞定_超声波扫描建模 python库
文章浏览阅读4.2k次。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。2.使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。_凯撒加密
文章浏览阅读5.7k次。CIP报文解析常用到的几个字段:普通类型服务类型:[0x00], CIP对象:[0x02 Message Router], ioi segments:[XX]PCCC(带cmd和func)服务类型:[0x00], CIP对象:[0x02 Message Router], cmd:[0x101], fnc:[0x101]..._cip协议embedded_service_error
文章浏览阅读2.4k次,点赞9次,收藏13次。有时候我们在MFC项目开发过程中,需要用到一些微软已经提供的功能,如VC++使用EXCEL功能,这时候我们就能直接通过VS2019到如EXCEL.EXE方式,生成对应的OLE头文件,然后直接使用功能,那么,我们上篇文章中介绍了vs2017及以前的版本如何来添加。但由于微软某些方面考虑,这种方式已被放弃。从上图中可以看出,这一功能,在从vs2017版本15.9开始,后续版本已经删除了此功能。那么我们如果仍需要此功能,我们如何在新版本中添加呢。_vs添加mfc库
文章浏览阅读785次。用ac3编码,执行编码函数时报错入如下:[ac3 @ 0x7fed7800f200] frame_size (1536) was not respected for anon-last frame (avcodec_encode_audio2)用ac3编码时每次送入编码器的音频采样数应该是1536个采样,不然就会报上述错误。这个数字并非刻意固定,而是跟ac3内部的编码算法原理相关。全网找不到,国内音视频之路还有很长的路,音视频人一起加油吧~......_frame_size (1024) was not respected for a non-last frame
文章浏览阅读230次,点赞2次,收藏2次。创建Android应用程序一个项目里面可以有很多模块,而每一个模块就对应了一个应用程序。项目结构介绍_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量