• 周四. 8月 11th, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

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

admin

11月 28, 2021

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,["[email protected]"])
    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>

发表评论

您的电子邮箱地址不会被公开。