BIGEMAP卫星地图_高清卫星地图_北斗高清地图_地图软件_矢量地图数据_专题地图

顯示源代碼
可視域分析
 開發文檔
            <!DOCTYPE html>

<html>
<head>
    <meta charset='UTF-8'/>
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no'/>
    <link  rel='stylesheet'/>
    <script src='http://ua.bigemap.com:30081/bmsdk/bigemap-gl.js/v1.1.0/bigemap-gl.js'></script>
    <style>
        body {
            margin: 0;
            padding: 0;
        }
        #container {
            position: absolute;
            top: 0;
            bottom: 0;
            width: 100%;
        }
        .info{
            position: absolute;
            top:0;
            left: 0;
            right: 0;
            z-index: 9;
            text-align: center;
            height: 30px;
            line-height: 30px;
            color: #909399;
            background: #f4f4f5;
        }
    </style>
    <title>part_test</title>
</head>
<body>
    <div class="info">
    點擊地圖可以獲取當前位置的可視域分析(藍色表示可見,紅色不為可見)
</div>
<div id='container'></div>
<script>
    bmgl.Config.HTTP_URL = 'http://ua.bigemap.com:30081/bmsdk/';
    var viewer = new bmgl.Viewer('container', {mapId: 'bigemap.dc-satellite',requestRenderMode:false,terrainId: 'bigemap.dc-terrain'});
    //設置初始位置
    viewer.camera.setView({
        destination: bmgl.Cartesian3.fromDegrees(103.59526245619938,30.9814012061604,3837.4144546),
        orientation: {"heading":6.282150327905171,"roll":6.279635689524259,"pitch":-0.6993902253931052}
    });
    //當前的視點坐標
    var startPoint={
        lng:103.5898409037154,
        lat:31.012823472619534
    };
    var clickAble=true;
    viewer.screenSpaceEventHandler.setInputAction(function (e) {
        var ray=viewer.camera.getPickRay(e.position);
        var c=viewer.scene.globe.pick(ray,viewer.scene);
        if (!clickAble||!bmgl.defined(c))return;
        clickAble=false;
        setTimeout(()=>{
            clickAble=true;
        },1000);
        c=bmgl.Cartographic.fromCartesian(c);
        startPoint.lng=bmgl.Math.toDegrees(c.longitude)
        startPoint.lat=bmgl.Math.toDegrees(c.latitude);
        drawLine();
    },bmgl.ScreenSpaceEventType.LEFT_CLICK);
    var pointArr=[];
    viewer.scene.globe.depthTestAgainstTerrain=true;
    setTimeout(function () {
        //1秒后開始畫視角
        drawLine();
    },1000);
    function drawLine() {
        pointArr.map(v=>v.remove());
        pointArr.length=0;
        var viewHeight = 1.5;//視角高度
        var cartographicCenter = bmgl.Cartographic.fromDegrees(startPoint.lng, startPoint.lat);
        var cartesianCenterH0 = bmgl.Cartesian3.fromRadians(cartographicCenter.longitude, cartographicCenter.latitude);
        var cartesianPointH0 = bmgl.Cartesian3.fromDegrees(startPoint.lng+0.02, startPoint.lat+0.01);
        var ab = bmgl.Cartesian3.distance(cartesianCenterH0, cartesianPointH0);
        var eopt = {};
        eopt.semiMinorAxis = ab;
        eopt.semiMajorAxis = ab;
        eopt.rotation = 0;
        eopt.center = cartesianCenterH0;
        eopt.granularity = Math.PI / 20;//間隔
        var ellipse = computeEllipseEdgePositions(eopt);
        for (var i = 0; i < ellipse.outerPositions.length; i += 3) {
            //逐條計算可視域
            var cartesian = new bmgl.Cartesian3(ellipse.outerPositions[i], ellipse.outerPositions[i + 1], ellipse.outerPositions[i + 2]);
            var cartographic = bmgl.Cartographic.fromCartesian(cartesian);
            var deltaRadian = 0.00005 * Math.PI / 180.0;
            var cartographicArr = InterpolateLineCartographic(cartographicCenter, cartographic, deltaRadian);
            getTerrain(cartographicArr,terrainData=>{
                try {
                    if (terrainData.length > 0) {
                        var preVisible = true;
                        var cartesiansLine = [];
                        var colors = [];
                        for (var j = 1; j < terrainData.length; j++) {
                            //逐點計算可見性
                            var visible = true;//該點可見性
                            if (j > 1) {
                                var cartographicCenterHV = new bmgl.Cartographic(terrainData[0].longitude, terrainData[0].latitude, terrainData[0].height + viewHeight);
                                //
                                if (preVisible) {
                                    //
                                    var curPoint = InterpolateIndexLineHeightCartographic(cartographicCenterHV, terrainData[j], j, j - 1);
                                    if (curPoint.height >= terrainData[j - 1].height) {
                                        preVisible = true;
                                        visible = true;
                                    } else {
                                        preVisible = false;
                                        visible = false;
                                    }
                                } else {
                                    //插值到當前
                                    var curPointArr = Interpolate2IndexLineHeightCartographic(cartographicCenterHV, terrainData[j], j, j - 1);
                                    for (var k = 0; k < curPointArr.length; k++) {
                                        if (curPointArr[k].height >= terrainData[k].height) {
                                            preVisible = true;
                                            visible = true;
                                        } else {
                                            preVisible = false;
                                            visible = false;
                                            break;
                                        }
                                    }
                                }
                            }
                            var cartesianTemp = bmgl.Cartesian3.fromRadians(terrainData[j].longitude, terrainData[j].latitude, terrainData[j].height + 0.10);
                            cartesiansLine.push(cartesianTemp);
                            //繪制點
                            if (visible) {
                                colors.push(0);
                                colors.push(0);
                                colors.push(1);
                                colors.push(1);
                            } else {
                                colors.push(1);
                                colors.push(0);
                                colors.push(0);
                                colors.push(1);
                            }
                        }
                        //繪制結果
                        var pointsKSY = new PrimitivePoints({ 'viewer': viewer, 'Cartesians': cartesiansLine, 'Colors': colors });
                        pointArr.push(pointsKSY);
                    } else {
                        console.log("高程異常!");
                    }
                }catch (e) {
                    console.log(e);
                }
            })
        }
    }


    function getTerrain(arr,callback) {
        bmgl.sampleTerrainMostDetailed(viewer.terrainProvider,arr).then(data=>{
            callback(data);
        })
    }

    /**
     * options.semiMinorAxis:短半軸
     * options.semiMajorAxis:長半軸
     * options.rotation:旋轉角度 弧度
     * options.center:中心點 笛卡爾坐標
     * options.granularity:粒度 弧度
     * Returns an array of positions that make up the ellipse.
     * @private
     */
    function  computeEllipseEdgePositions(options) {
        var unitPosScratch = new bmgl.Cartesian3();
        var eastVecScratch = new bmgl.Cartesian3();
        var northVecScratch = new bmgl.Cartesian3();
        var scratchCartesian1 = new bmgl.Cartesian3();
        var semiMinorAxis = options.semiMinorAxis;
        var semiMajorAxis = options.semiMajorAxis;
        var rotation = options.rotation;//法線
        var center = options.center;
        var granularity = options.granularity && (typeof options.granularity === "number") ? options.granularity : (Math.PI / 180.0);// 角度間隔
        if (granularity > Math.PI / 12.0) { granularity = Math.PI / 12.0; }//最小分24
        if (granularity < Math.PI / 180.0) { granularity = Math.PI / 180.0; }//最大分360
        var aSqr = semiMinorAxis * semiMinorAxis;
        var bSqr = semiMajorAxis * semiMajorAxis;
        var ab = semiMajorAxis * semiMinorAxis;
        var mag = bmgl.Cartesian3.magnitude(center);//
        var unitPos = bmgl.Cartesian3.normalize(center, unitPosScratch);
        var eastVec = bmgl.Cartesian3.cross(bmgl.Cartesian3.UNIT_Z, center, eastVecScratch);
        eastVec = bmgl.Cartesian3.normalize(eastVec, eastVec);
        var northVec = bmgl.Cartesian3.cross(unitPos, eastVec, northVecScratch);
        var numPts = Math.ceil(bmgl.Math.PI*2 / granularity);
        var deltaTheta = granularity;
        var theta = 0;

        var position = scratchCartesian1;
        var i;
        var outerIndex = 0;
        var outerPositions = [];
        for (i = 0; i < numPts; i++) {
            theta = i * deltaTheta;
            position = pointOnEllipsoid(theta, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, position);

            outerPositions[outerIndex++] = position.x;
            outerPositions[outerIndex++] = position.y;
            outerPositions[outerIndex++] = position.z;
        }

        var r = {};
        r.numPts = numPts;
        r.outerPositions = outerPositions;
        return r;
    };
    /*
        線段插值
        經緯度坐標插值
        Cartographic start.longitude start.latitude 單位:弧度
        return [Cartographic,...]
        */
     function InterpolateLineCartographic(start, end, _Delta) {
        if (start && end) { } else { return null; }
        if (start.longitude && start.latitude && end.longitude && end.latitude) { } else { return null; }
        var result = [];
        //開始點
        result.push(new bmgl.Cartographic(start.longitude, start.latitude));
        var interval = Math.sqrt(Math.pow((end.longitude - start.longitude), 2) + Math.pow((end.latitude - start.latitude), 2));
        var delta = _Delta && (typeof _Delta === 'number') ? _Delta : DeltaRadian;
        if (interval <= delta) {
            //小于最小間隔
            result.push(new bmgl.Cartographic(end.longitude, end.latitude));
            return result;
        } else {
            var num = interval / delta;
            var stepLon = (end.longitude - start.longitude) / num;
            var stepLat = (end.latitude - start.latitude) / num;
            for (var i = 0; i < num; i++) {
                var lon = start.longitude + (i + 1) * stepLon;
                var lat = start.latitude + (i + 1) * stepLat;
                result.push(new bmgl.Cartographic(lon, lat));//與最后一個點有偏差
            }
            result.push(new bmgl.Cartographic(end.longitude, end.latitude, end.height));
        }
        return result;
    }
    function InterpolateIndexLineHeightCartographic(start, end, num, index) {
        if (start && end) { } else { return null; }
        if (start.longitude && start.latitude && end.longitude && end.latitude) { } else { return null; }
        //var delta = _Delta && (typeof _Delta === 'number') ? _Delta : DeltaRadian;
        var stepLon = (end.longitude - start.longitude) / num;
        var stepLat = (end.latitude - start.latitude) / num;
        var stepHeight = (end.height - start.height) / num;
        var lon = start.longitude + index * stepLon;
        var lat = start.latitude + index * stepLat;
        var hieght = start.height + index * stepHeight;
        var result = new bmgl.Cartographic(lon, lat, hieght);
        return result;
    }
    
    /*
       線段插值
       經緯度高程插值
       Cartographic start.longitude start.latitude 單位:弧度 start.height 高程單位m
       num:分總段數  傳入數組長度-1
       index:獲取到第index點的所有插值 0點是開始點
       return [Cartographic,...]
       */
    function Interpolate2IndexLineHeightCartographic(start, end, num, curIndex) {
        if (start && end) { } else { return null; }
        if (start.longitude && start.latitude && end.longitude && end.latitude) { } else { return null; }
        var result = [];
        result.push(new bmgl.Cartographic(start.longitude, start.latitude, start.height));
        var stepLon = (end.longitude - start.longitude) / num;
        var stepLat = (end.latitude - start.latitude) / num;
        var stepHeight = (end.height - start.height) / num;
        for (var i = 0; i < curIndex; i++) {
            var lon = start.longitude + (i + 1) * stepLon;
            var lat = start.latitude + (i + 1) * stepLat;
            var hieght = start.height + (i + 1) * stepHeight;
            result.push(new bmgl.Cartographic(lon, lat, hieght));
        }
        //result.push(new bmgl.Cartographic(end.longitude, end.latitude, end.height));
        return result;
    }
    function pointOnEllipsoid(theta, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, result) {
        var rotAxis = new bmgl.Cartesian3();
        var tempVec = new bmgl.Cartesian3();
        var unitQuat = new bmgl.Quaternion();
        var rotMtx = new bmgl.Matrix3();

        var azimuth = theta + rotation;

        bmgl.Cartesian3.multiplyByScalar(eastVec, Math.cos(azimuth), rotAxis);
        bmgl.Cartesian3.multiplyByScalar(northVec, Math.sin(azimuth), tempVec);
        bmgl.Cartesian3.add(rotAxis, tempVec, rotAxis);

        var cosThetaSquared = Math.cos(theta);
        cosThetaSquared = cosThetaSquared * cosThetaSquared;

        var sinThetaSquared = Math.sin(theta);
        sinThetaSquared = sinThetaSquared * sinThetaSquared;

        var radius = ab / Math.sqrt(bSqr * cosThetaSquared + aSqr * sinThetaSquared);
        var angle = radius / mag;

        // Create the quaternion to rotate the position vector to the boundary of the ellipse.
        bmgl.Quaternion.fromAxisAngle(rotAxis, angle, unitQuat);
        bmgl.Matrix3.fromQuaternion(unitQuat, rotMtx);

        bmgl.Matrix3.multiplyByVector(rotMtx, unitPos, result);
        bmgl.Cartesian3.normalize(result, result);
        bmgl.Cartesian3.multiplyByScalar(result, mag, result);
        return result;
    }

    var PrimitivePoints = (
        function () {
            var vertexShader;
            var fragmentShader;
            var geometry;
            var appearance;
            var viewer;
            function _(options) {
                viewer = options.viewer;
                vertexShader = VSPolylie();
                fragmentShader = FSPolyline();
                if (options.Cartesians && options.Cartesians.length >= 2) {
                    var postionsTemp = [];
                    var colorsTemp = [];
                    var indicesTesm = [];
                    if (options.Colors && options.Colors.length === options.Cartesians.length * 4) {
                        for (var i = 0; i < options.Cartesians.length; i++) {
                            postionsTemp.push(options.Cartesians[i].x);
                            postionsTemp.push(options.Cartesians[i].y);
                            postionsTemp.push(options.Cartesians[i].z);
                        }
                        colorsTemp = options.Colors;
                    } else {
                        for (var i = 0; i < options.Cartesians.length; i++) {
                            postionsTemp.push(options.Cartesians[i].x);
                            postionsTemp.push(options.Cartesians[i].y);
                            postionsTemp.push(options.Cartesians[i].z);
                            //
                            colorsTemp.push(0.0);
                            colorsTemp.push(0.0);
                            colorsTemp.push(1.0);
                            colorsTemp.push(1.0);
                        }
                    }
                    for (var i = 0; i < options.Cartesians.length; i++) {
                        indicesTesm.push(i);
                    }
                    this.positionArr = new Float64Array(postionsTemp);
                    this.colorArr = new Float32Array(colorsTemp);
                    this.indiceArr = new Uint16Array(indicesTesm);

                } else { // if (options.Cartesians && options.Cartesians.length >= 2) {
                    var p1 = bmgl.Cartesian3.fromDegrees(0, 0, -10);
                    var p2 = bmgl.Cartesian3.fromDegrees(0, 0.001, -10);
                    this.positionArr = new Float64Array([
                        p1.x, p1.y, p1.z,
                        p2.x, p2.y, p2.z
                    ]);
                    //默認藍色
                    this.colorArr = new Float32Array([
                        0.0, 0.0, 1.0, 1.0,
                        0.0, 0.0, 1.0, 1.0
                    ]);
                    this.indiceArr = new Uint16Array([0, 1]);
                }

                geometry = CreateGeometry(this.positionArr, this.colorArr, this.indiceArr);
                appearance = CreateAppearence(fragmentShader, vertexShader);

                this.primitive = viewer.scene.primitives.add(new bmgl.Primitive({
                    geometryInstances: new bmgl.GeometryInstance({
                        geometry: geometry
                    }),
                    appearance: appearance,
                    asynchronous: false
                }));
            }

            function CreateGeometry(positions, colors, indices) {
                return new bmgl.Geometry({
                    attributes: {
                        position: new bmgl.GeometryAttribute({
                            componentDatatype: bmgl.ComponentDatatype.DOUBLE,
                            componentsPerAttribute: 3,
                            values: positions
                        }),
                        color: new bmgl.GeometryAttribute({
                            componentDatatype: bmgl.ComponentDatatype.FLOAT,
                            componentsPerAttribute: 4,
                            values: colors
                        })
                    },
                    indices: indices,
                    primitiveType: bmgl.PrimitiveType.POINTS,
                    boundingSphere: bmgl.BoundingSphere.fromVertices(positions)
                });
            }

            function CreateAppearence(fs, vs) {
                return new bmgl.Appearance({
                    renderState: {
                        blending: bmgl.BlendingState.PRE_MULTIPLIED_ALPHA_BLEND,
                        depthTest: { enabled: true },
                        depthMask: true
                    },
                    fragmentShaderSource: fs,
                    vertexShaderSource: vs
                });
            }

            function VSPolylie() {
                return "attribute vec3 position3DHigh;\
                        attribute vec3 position3DLow;\
                        attribute vec4 color;\
                        varying vec4 v_color;\
                        attribute float batchId;\
                        void main()\
                        {\
                            vec4 p = czm_computePosition();\
                            v_color =color;\
                            p = czm_modelViewProjectionRelativeToEye * p;\
                            gl_Position = p;\
                            gl_PointSize=4.0;\
                        }\
                        ";
            }

            function FSPolyline() {
                return "varying vec4 v_color;\
            void main()\
            {\
                 float d = distance(gl_PointCoord, vec2(0.5,0.5));\
                 if(d < 0.5){\
                    gl_FragColor = v_color;\
                 }else{\
                    discard;\
                 }\
            }\
            ";
            }

            _.prototype.remove = function () {
                if (this.primitive != null) {
                    viewer.scene.primitives.remove(this.primitive);
                    this.primitive = null;
                }
            }
            _.prototype.updateCartesianPosition = function (cartesians) {
                if (this.primitive != null) {
                    viewer.scene.primitives.remove(this.primitive);
                    if (cartesians && cartesians.length < 2) { return; }
                    if (cartesians.length === this.positionArr.length / 3) {
                        var p1 = cartesians[0];
                        var p2 = cartesians[1];
                        this.positionArr = new Float64Array([
                            p1.x, p1.y, p1.z,
                            p2.x, p2.y, p2.z
                        ]);
                        geometry = CreateGeometry(this.positionArr, this.colorArr, this.indiceArr);
                    } else {
                        //默認藍色
                        var postionsTemp = [];
                        var colorsTemp = [];
                        var indicesTesm = [];
                        for (var i = 0; i < cartesians.length; i++) {
                            postionsTemp.push(cartesians[i].x);
                            postionsTemp.push(cartesians[i].y);
                            postionsTemp.push(cartesians[i].z);

                            colorsTemp.push(0.0);
                            colorsTemp.push(0.0);
                            colorsTemp.push(1.0);
                            colorsTemp.push(1.0);
                        }
                        for (var i = 0; i < cartesians.length; i++) {
                            indicesTesm.push(i);
                        }
                        this.positionArr = new Float64Array(postionsTemp);
                        this.colorArr = new Float32Array(colorsTemp);
                        this.indiceArr = new Uint16Array(indicesTesm);

                        geometry = CreateGeometry(this.positionArr, this.colorArr, this.indiceArr);
                        appearance = CreateAppearence(fragmentShader, vertexShader);
                    }

                    this.primitive = viewer.scene.primitives.add(new bmgl.Primitive({
                        geometryInstances: new bmgl.GeometryInstance({
                            geometry: geometry
                        }),
                        appearance: appearance,
                        asynchronous: false
                    }));
                } else { return; }
            }
            _.prototype.updateCartesianPositionColor = function (cartesians, colors) {
                if (colors.length === cartesians.length * 4) { } else { return; }
                if (this.primitive != null) {
                    viewer.scene.primitives.remove(this.primitive);
                    if (cartesians && cartesians.length < 2) { return; }
                    if (cartesians.length === this.positionArr.length / 3) {
                        var p1 = cartesians[0];
                        var p2 = cartesians[1];
                        this.positionArr = new Float64Array([
                            p1.x, p1.y, p1.z,
                            p2.x, p2.y, p2.z
                        ]);

                        this.colorArr = new Float32Array(colors);

                        geometry = CreateGeometry(this.positionArr, this.colorArr, this.indiceArr);
                    } else {
                        var postionsTemp = [];
                        var indicesTesm = [];

                        for (var i = 0; i < cartesians.length; i++) {
                            postionsTemp.push(cartesians[i].x);
                            postionsTemp.push(cartesians[i].y);
                            postionsTemp.push(cartesians[i].z);
                        }
                        for (var i = 0; i < cartesians.length; i++) {
                            indicesTesm.push(i);
                        }
                        this.positionArr = new Float64Array(postionsTemp);
                        this.colorArr = new Float32Array(colors);
                        this.indiceArr = new Uint16Array(indicesTesm);

                        geometry = CreateGeometry(this.positionArr, this.colorArr, this.indiceArr);
                        appearance = CreateAppearence(fragmentShader, vertexShader);
                    }

                    this.primitive = viewer.scene.primitives.add(new bmgl.Primitive({
                        geometryInstances: new bmgl.GeometryInstance({
                            geometry: geometry
                        }),
                        appearance: appearance,
                        asynchronous: false
                    }));
                } else { return; }
            }
            return _;
        })();
</script>
</body>
</html>
                                                                                                                                                                                            
主站蜘蛛池模板: 清河县隆鑫密封件有限公司,汽车用密封条,配电箱柜、集装箱密封胶条,建筑门窗、家具用密封条,无毒环保医用密封条,船舶、农机用密封条,异型产品 | 河南电梯公司_郑州电梯公司_河南家用别墅电梯厂家-郑州嘉祥机电设备公司 | 智能电地暖_电地暖安装_电地暖价格-西安秦星暖通工程有限公司 | 石膏砂浆生产线_特种砂浆生产线_轻质抹灰石膏设备-青岛环港重工科技有限公司 | 景观造雾_人造雾设备_雾森系统_冷雾降温_雾化消毒_喷雾除尘厂家-成都景程雾森 | 铝型材定制_东莞铝型材_散热器铝型材_工业铝合金型材挤压加工生产厂家价格-中亚铝业 | 铅板,防辐射铅板,医用铅板,保定美伦有色金属有限公司 | 无机纤维抗菌板-A级不燃纤维板-石英纤维板厂家-医疗抗菌板-浙江德耐姆 | 上海恩计仪器首页-微生物限度检测仪-微生物限度仪厂家 | 纸袋胶-糊盒胶-礼盒胶-裱纸胶-水性喷胶-东莞市美好化工有限公司 纸袋机|多层纸袋机|高速纸袋机|无锡市天天友情机械有限公司 | 荣事达电动洗地机_全自动工业洗地车_扫地机_清洁设备工厂 | 木雕红木家具网_红木家具厂_专业的红木家具批发网 | 专业音响设备|数字功放|舞台音响|ktv音响|会议音响-劳伦士 | 阻垢剂|缓蚀剂|杀菌剂|分散剂|水处理剂|印染助剂|水处理药剂|造纸助剂|膜阻垢剂|缓蚀剂|HEDP|ATMP|螯合剂-山东凯瑞化学有限公司 水处理药剂生产厂家 | 威学一百-专注国际学校择校备考-DSE-A-level-雅思-托福-OSSD-港澳台联考-AP-IGCSE-IB-AMC-多邻国-PTE-SAT-SSAT-小语种(如日语,韩语,德语,法语,西班牙语,意大利语,俄语,泰语)等考试培训,为出国留学学生提供个性化定制性学习方案,线下实体面授+线上网络课程, 提供一对一,小班课等多种班型 | 苏州交通设施_道路划线_停车场划线_厂区划线_环氧地坪厂家-推荐【飞扬市政交通设施公司】专注交通设施8年! | 潍坊沃林机械设备有限公司-牵引式风送果园打药机,悬挂式风送果园喷雾机,自走式果树喷药机,车载式风送远程喷雾机-潍坊沃林机械设备有限公司-牵引式风送果园打药机,悬挂式风送果园喷雾机,自走式果树喷药机,车载式风送远程喷雾机 潍坊网络推广,临沂360推广,东营360推广,枣庄360推广,潍坊网站建设,潍坊网络公司,潍坊360搜索,潍坊APP开发,潍坊360推广,潍坊360代理,潍坊点睛网络科技有限公司 | 赛车微信群二维码平台下载【找群网zhaoqun5.com】 | 陶瓷-超高速胶体磨-高剪切胶体磨厂家价格-上海思峻机械设备有限公司 | 疲劳试验机|电子万能试验机|摩擦磨损试验机|冲击试验机|济南全力测试技术有限公司 | 一次性妇科用品_一次性医疗用品_一次性口腔器械盒_天津市双利医疗器械有限责任公司 | 塑料振动筛-防腐蚀振动筛-聚丙烯振动筛-塑料振动筛厂家河南迈能机械设备有限公司 | 域发官网-皮肤学级头皮养固领先者| 线性排水沟-成品排水沟-树脂排水沟-树脂混凝土,缝隙式排水沟-时利和 | 深圳市佳顺优印印刷有限公司,佳顺优印,画册印刷,海报印刷,封套印刷,手提袋印刷,包装盒印刷,彩盒印刷,无碳纸印刷,不干胶印刷,信封印刷,便笺印刷,笔记本印刷,台历印刷,挂历印刷,国际会展中心附近印刷厂,宝安印刷厂,宝安教材印刷厂 | 无锡双海金属科技有限公司[官网] | 重庆化粪池清淘_管道疏通_高压疏通清洗管道_电话:023-68183336,15723234763 | 鑫金牛建设工程(苏州)有限公司| 深圳车牌识别系统厂家_人脸识别厂家_通道闸厂家_车位引导系统_智慧社区管理系统_深圳市利普诺科技有限公司官网 | 山东汇河环保科技集团有限公司,水囊水袋,水罐,油囊,预压水袋,吊重水袋_山东汇河环保科技集团有限公司,水囊水袋,水罐,油囊,预压水袋,吊重水袋 | 南京仁康体检--南京仁康门诊部有限公司| 减速电机-调速电机-四大系列减速机-减速电机厂家-深圳市鑫希田机电有限公司官网 | 水硬度在线分析仪-氟离子|悬浮固体浓度分析仪-ldo分析仪-上海植茂 | 昆明塑料包装袋|云南塑料包装袋|昆明塑料袋厂家|云南茶叶大米蔬菜种子食品包装袋就来阮门包装有限公司 | 青州市昌达机械设备有限公司_洗石机-洗砂机-筛沙机-砂石分离机-洗轮机-制砂机 | 济南诚润达贸易有限公司 - 专注专营巴斯夫防冻冷却液 | 全自动贴标机厂家-深圳市优斯迪自动贴标机官网 | 消泡剂厂家-水处理消泡剂-有机硅消泡剂-广东广州多美多消泡剂厂家 | 种植槽系统,移动苗床,多层种植货架,潮汐苗床,物流苗床,潮汐面板,立体旋转育秧床,河北博超温室设备有限公司 | 智能化解决方案 智能家居 家庭影院 灯光音箱 会议室报告厅 剧场剧院 指挥中心 大数据中心_沈阳天哲科技有限公司 | 中国国际石油石化技术装备展览会|振威展览|