• 高德javascript api使用 arcgis 发布的wmts服务


    1.使用python代码修改wgs84 下图层每个要素的坐标,2。将wgs转换到 web mercator(3857), 3、发布服务,切片缓存,得到wmts地址

     

     发布完成之后在 arcgis sever manager中的OGC 下可以看到wmts 服务地址

     

    但这样发布的wmts有个问题,就是高德的坐标是经过偏移的,以上使用wgs84  4326投影到 web mercator 3857之上不行的,是有个偏移的。

    需要一次转换

    # wgs84转高德
    def wgs84togcj02(lng, lat):
        PI = 3.1415926535897932384626
        ee = 0.00669342162296594323
        a = 6378245.0
        dlat = transformlat(lng - 105.0, lat - 35.0)
        dlng = transformlng(lng - 105.0, lat - 35.0)
        radlat = lat / 180.0 * PI
        magic = math.sin(radlat)
        magic = 1 - ee * magic * magic
        sqrtmagic = math.sqrt(magic)
        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI)
        dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * PI)
        mglat = lat + dlat
        mglng = lng + dlng
        return [mglng, mglat]
    def transformlat(lng, lat):
        PI = 3.1415926535897932384626
        ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * 
              lat + 0.1 * lng * lat + 0.2 * math.sqrt(abs(lng))
        ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 *
                math.sin(2.0 * lng * PI)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lat * PI) + 40.0 *
                math.sin(lat / 3.0 * PI)) * 2.0 / 3.0
        ret += (160.0 * math.sin(lat / 12.0 * PI) + 320 *
                math.sin(lat * PI / 30.0)) * 2.0 / 3.0
        return ret
    def transformlng(lng, lat):
        PI = 3.1415926535897932384626
        ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 
              0.1 * lng * lat + 0.1 * math.sqrt(abs(lng))
        ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 *
                math.sin(2.0 * lng * PI)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lng * PI) + 40.0 *
                math.sin(lng / 3.0 * PI)) * 2.0 / 3.0
        ret += (150.0 * math.sin(lng / 12.0 * PI) + 300.0 *
                math.sin(lng / 30.0 * PI)) * 2.0 / 3.0
        return ret

    然后遍历修改每个要素的图形坐标

    def change_polygon(polygon,SR):
        parts = arcpy.Array()
        rings = arcpy.Array()
        ring = arcpy.Array()
        for part in polygon:
            for pnt in part:
                if pnt:
                    pts=wgs84togcj02(pnt.X, pnt.Y)
                    ring.add(arcpy.Point(pts[0], pts[1]))
                    # ring.add(arcpy.Point(pnt.X, pnt.Y))
                else:
                    # null point - we are at the start of a new ring
                    rings.add(ring)
                    ring.removeAll()
            # we have our last ring, add it
            rings.add(ring)
            ring.removeAll()
            # if we only have one ring: remove nesting
            if len(rings) == 1:
                rings = rings.getObject(0)
            parts.add(rings)
            rings.removeAll()
        # if single-part (only one part) remove nesting
        if len(parts) == 1:
            parts = parts.getObject(0)
        return arcpy.Polygon(parts, SR)
    
    
    xuequ_path=r'D:	empxuequ.gdb'
    env.workspace = xuequ_path
    env.overwriteOutput = True
    
    poly_dict={}
    SR = arcpy.SpatialReference(4326)
    #datasets = arcpy.ListDatasets()
    featureclasses = arcpy.ListFeatureClasses(feature_dataset='DX84')
    for fc in featureclasses:
        cur1=arcpy.da.UpdateCursor(fc,["SHAPE@"])
        for row in cur1:
            row[0]=change_polygon(row[0],SR)
            cur1.updateRow(row)
        del cur1
    
    print('over')

    这个结果仍是 wgs1984  4326的。再投影转换到 web mercator上。也可以先创建dataset 再导入要素类方式(不用投影了)

     高德api 测试代码

    <!doctype html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
        <title>TileLayer.WMTS</title>
        <style>
            html,
            body,
            #container {
                margin: 0;
                padding: 0;
                width: 100%;
                height: 100%;
            }
        </style>
    </head>
    <body>
    <div id="container"></div>
    <script src="//webapi.amap.com/maps?v=2.0&key=9252xxxxxxxxxxxxxxaf1344548bd"></script>
    <script>
        var map = new AMap.Map('container', {
            zoom: 12,
            center: [119.407133,32.394838]
        });
    
    

    // xuequ5 是切片 wmts
    // var wms = new AMap.TileLayer.WMTS({
    // url: 'http://10.44.118:6080/arcgis/rest/services/yz/xuequ5/MapServer/WMTS',
    // blend: false,
    // tileSize: 256,
    // params: {
    // Layer: '学区小学学区5',
    // Version: '1.0.0',
    // Format: 'image/png',
    // TileMatrixSet: 'EPSG:3857'
    // }
    // });
    // wms.setMap(map);

    
    


    //矢量动态 wms
    var wms = new AMap.TileLayer.WMS({
    url: 'http://10.44.118:6080/arcgis/services/yz/xuequ6/MapServer/WmsServer', // wms服务的url地址
    blend: false, // 地图级别切换时,不同级别的图片是否进行混合
    params: {
    styles: 'default',
    version: '1.3.0',
    layers: '1'
    }
    });
    map.add(wms);

    </script>
    </body>
    </html>
  • 相关阅读:
    头像裁剪
    实现视频音频基本功能
    原生js实现淘宝验证滑动条 onmousedown onmousemove onmouseup
    hammer实现手机滑动条
    用hammer实现触摸 pan 方法
    TCP cs通信(接收传输)
    HDU6010 DayLight Saving Light(模拟)
    HDU_6000 Wash!(贪心)
    HDU_5783_DivideTheSequence
    LCS(HDU_5495 循环节)
  • 原文地址:https://www.cnblogs.com/yansc/p/15067467.html
Copyright © 2020-2023  润新知