Google maps 加上「;搜索区“;谷歌地图结果的轮廓

Google maps 加上「;搜索区“;谷歌地图结果的轮廓,google-maps,google-maps-api-3,Google Maps,Google Maps Api 3,去年,谷歌在其产品中添加了搜索区域轮廓,正如许多地方报道的那样,在谷歌地图上也可以看到。例如,报告和 明确地说,这是google添加与搜索查询相关的大纲的时候。如果你要搜索一个城镇、邮政编码或邮政编码,谷歌会在地图上突出显示这个区域。例如: 这显然无法通过API获得,只能通过谷歌自己的web属性获得 最近,我注意到一些其他域正在使用此功能,例如 Twitter和其他大型组织是否有单独的API?是否已添加此功能,但尚未记录?或者我只是错过了公告,找不到任何文档?你在那里看到的提纲来自twitte

去年,谷歌在其产品中添加了搜索区域轮廓,正如许多地方报道的那样,在谷歌地图上也可以看到。例如,报告和

明确地说,这是google添加与搜索查询相关的大纲的时候。如果你要搜索一个城镇、邮政编码或邮政编码,谷歌会在地图上突出显示这个区域。例如:

这显然无法通过API获得,只能通过谷歌自己的web属性获得

最近,我注意到一些其他域正在使用此功能,例如


Twitter和其他大型组织是否有单独的API?是否已添加此功能,但尚未记录?或者我只是错过了公告,找不到任何文档?

你在那里看到的提纲来自twitter,它们一定已经存储好了

查看调用twitter页面时请求的json文件:

我已经试过了,
几何。坐标[0][0]
定义了一个精细的多边形(猜一下奥斯汀的轮廓)

当您尝试时,请注意该对的顺序是
lng,lat
而不是
lat,lng

因此,这可能是实现大纲的一个良好开端,幸运的是twitter支持用于客户端解决方案的JSONP

请参见一个示例:

twitter API已更改,示例不再有效(需要身份验证)


我找到了一个画城市边界的很好的解决方案

这是一个非常酷的工具,你可以在这里画城市边界。您可以随心所欲地做到:

在右侧,您可以看到代码的实时预览。您可以在KML和javascript之间进行选择。切换到javascript。然后复制你的坐标

在这里,你可以看到布鲁塞尔(欧洲)的边界


::地图:
var映射;
//库德
布鲁塞尔变量=[
新google.maps.LatLng(50.835866,4.258575),
新的google.maps.LatLng(50.818083,4.244499),
新google.maps.LatLng(50.811358,4.276428),
新的google.maps.LatLng(50.813094,4.302177),
新google.maps.LatLng(50.773162,4.338226),
新google.maps.LatLng(50.764259,4.384918),
新google.maps.LatLng(50.793132,4.482422),
新google.maps.LatLng(50.810274,4.450836),
新google.maps.LatLng(50.821120,4.476585),
新google.maps.LatLng(50.852342,4.462852),
新google.maps.LatLng(50.866861,4.421310),
新google.maps.LatLng(50.895021,4.430580),
新google.maps.LatLng(50.911692,4.413757),
新google.maps.LatLng(50.912342,4.395561),
新google.maps.LatLng(50.898486,4.377708),
新google.maps.LatLng(50.900868,4.328957),
新google.maps.LatLng(50.889174,4.293251),
新google.maps.LatLng(50.880294,4.297028),
新google.maps.LatLng(50.861878,4.279175),
新google.maps.LatLng(50.855593,4.288788),
新google.maps.LatLng(50.837817,4.282608),
新google.maps.LatLng(50.835866,4.259605)
];
$(文档).ready(函数(){
//你的地图在哪里居中
var latlng=新的google.maps.latlng(50.834999,4.387665);
变量myOptions={
缩放:10,
中心:拉特林,
mapTypeId:google.maps.mapTypeId.ROADMAP
};
map=new google.maps.map(document.getElementById(“map_canvas”),myOptions);
var BrusselsHightlight;
//绘制多边形或多段线
BrusselsHightlight=新建google.maps.Polygon({
路径:布鲁塞尔,
strokeColor:#6666FF“,
笔划不透明度:0.8,
冲程重量:2,
fillColor:#6666FF“,
不透明度:0.35
});
BrusselsHightlight.setMap(map);
});
html,正文{高度:100%;边距:0px;填充:0px;}
#地图画布{
宽度:600px;
高度:400px;
}       

这对我来说真是太棒了。

因为地图API还没有提供解决方案,手动填写坐标不关任何人的事,这里有一个替代方案。在地理信息系统的网站上找到了这个答案——绝对的救星(如果画卡尔加里的话,会节省jurihandl很多时间,上图;D):

您可以在json中获取多边形坐标,以便与googlemaps一起使用 使用openstreetmap。去。搜索 像“加利福尼亚州旧金山”这样的地方

点击“详情”

查找OSM ID并复制它(control+c),例如:2018776

粘贴ID并下载 JSON文件


来源:

推特api地理端点不会给你城市边界

它们提供给您的只是带有5点(横向、纵向)的边界框

这是我从旧金山的推特API GEO中得到的

这让人有点头疼,但是你可以使用BING maps api来获取详细的多边形。他们让我们很难从他们的api中找出答案,但他们帮助了我。一旦他们发送数据给你,你就必须解压缩数据。他们在那篇文章中使用bing maps api绘制形状,但我正在将其转换为geojson。我就是这样做的

 function getBingMapsGeometry(latitude, longitude, entityType) {
   //api docs: https://docs.microsoft.com/en-us/bingmaps/spatial-data-services/geodata-api
        let baseUrl =
                "http://platform.bing.com/geo/spatial/v1/public/geodata?SpatialFilter=",
            levelOfDetail = 3,
            getAllPolygons = 1,
            getEntityMetadata = 1,
            culture = "en-us",
            userRegion = "US",
            preferCuratedPolygons = 1,
            responseFormat = "json",
            key = "your_api_key";
        return fetch(`${baseUrl}GetBoundary(${latitude},${longitude},${levelOfDetail},'${entityType}',${getAllPolygons},${getEntityMetadata},'${culture}','${userRegion}')&PreferCuratedPolygons=${preferCuratedPolygons}&$format=${responseFormat}&key=${key}`
        ).then(res => {
            res.json().then(result => {
                var entity = result.d.results[0];
                if (!entity) {
                    alert("no results");
                    return;
                }
            // much help from this post: https://blogs.bing.com/maps/2013/06/25/retrieving-boundaries-from-the-bing-spatial-data-services-preview
                var entityMetadata = entity.EntityMetadata;
                entityMetadata.name = entity.Name.EntityName;
                var primitives = entity.Primitives;
                var boundaryVertices = null;
                var numOfVertices = 0;
                var multyiPolygonArray = [];
                var singlePolygonArray;
                for (var i = 0; i < primitives.length; i++) {
                    var ringStr = primitives[i].Shape;
                    var ringArray = ringStr.split(",");

                    for (var j = 1; j < ringArray.length; j++) {
                        var polygonArray = new Array();
                        var array = ParseEncodedValue(ringArray[j]);

                        if (array.length > numOfVertices) {
                            numOfVertices = array.length;
                            boundaryVertices = array;
                        }
                        polygonArray.push(array);
                        if (ringArray.length > 1)
                            multyiPolygonArray.push(polygonArray);
                        else singlePolygonArray = polygonArray;
                    }
                }
                let geojson = {
                    type: "FeatureCollection",
                    features: [
                        {
                            type: "Feature",
                            properties: entityMetadata,
                            geometry: {
                                type: singlePolygonArray
                                    ? "Polygon"
                                    : "MultiPolygon",
                                coordinates: singlePolygonArray
                                    ? singlePolygonArray
                                    : multyiPolygonArray
                            }
                        }
                    ]
                };
return geojson;
            });
        });
    }

 function ParseEncodedValue(value) {
        var safeCharacters =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";
        var list = new Array();
        var index = 0;
        var xsum = 0;
        var ysum = 0;
        var max = 4294967296;

        while (index < value.length) {
            var n = 0;
            var k = 0;

            while (1) {
                if (index >= value.length) {
                    return null;
                }
                var b = safeCharacters.indexOf(value.charAt(index++));
                if (b == -1) {
                    return null;
                }
                var tmp = (b & 31) * Math.pow(2, k);

                var ht = tmp / max;
                var lt = tmp % max;

                var hn = n / max;
                var ln = n % max;

                var nl = (lt | ln) >>> 0;
                n = (ht | hn) * max + nl;
                k += 5;
                if (b < 32) break;
            }

            var diagonal = parseInt((Math.sqrt(8 * n + 5) - 1) / 2);
            n -= (diagonal * (diagonal + 1)) / 2;
            var ny = parseInt(n);
            var nx = diagonal - ny;
            nx = (nx >> 1) ^ -(nx & 1);
            ny = (ny >> 1) ^ -(ny & 1);
            xsum += nx;
            ysum += ny;
            var lat = ysum * 0.00001;
            var lon = xsum * 0.00001;
            list.push([lon, lat]);
        }
        return list;
    }
函数getBingMapsGeometry(纬度、经度、entityType){
//api文档:https://docs.microsoft.com/en-us/bingmaps/spatial-data-services/geodata-api
让baseUrl=
"http://platform.bing.com/geo/spatial/v1/public/geodata?SpatialFilter=",
详细级别=3,
getAllPolygons=1,
getEntityMetadata=1,
culture=“en us”,
userRegion=“US”,
preferCuratedPolygons=1,
responseFormat=“json”,
key=“你的api密钥”;
返回fetch(`${baseUrl}GetBoundary(${latitude},${longi
 function getBingMapsGeometry(latitude, longitude, entityType) {
   //api docs: https://docs.microsoft.com/en-us/bingmaps/spatial-data-services/geodata-api
        let baseUrl =
                "http://platform.bing.com/geo/spatial/v1/public/geodata?SpatialFilter=",
            levelOfDetail = 3,
            getAllPolygons = 1,
            getEntityMetadata = 1,
            culture = "en-us",
            userRegion = "US",
            preferCuratedPolygons = 1,
            responseFormat = "json",
            key = "your_api_key";
        return fetch(`${baseUrl}GetBoundary(${latitude},${longitude},${levelOfDetail},'${entityType}',${getAllPolygons},${getEntityMetadata},'${culture}','${userRegion}')&PreferCuratedPolygons=${preferCuratedPolygons}&$format=${responseFormat}&key=${key}`
        ).then(res => {
            res.json().then(result => {
                var entity = result.d.results[0];
                if (!entity) {
                    alert("no results");
                    return;
                }
            // much help from this post: https://blogs.bing.com/maps/2013/06/25/retrieving-boundaries-from-the-bing-spatial-data-services-preview
                var entityMetadata = entity.EntityMetadata;
                entityMetadata.name = entity.Name.EntityName;
                var primitives = entity.Primitives;
                var boundaryVertices = null;
                var numOfVertices = 0;
                var multyiPolygonArray = [];
                var singlePolygonArray;
                for (var i = 0; i < primitives.length; i++) {
                    var ringStr = primitives[i].Shape;
                    var ringArray = ringStr.split(",");

                    for (var j = 1; j < ringArray.length; j++) {
                        var polygonArray = new Array();
                        var array = ParseEncodedValue(ringArray[j]);

                        if (array.length > numOfVertices) {
                            numOfVertices = array.length;
                            boundaryVertices = array;
                        }
                        polygonArray.push(array);
                        if (ringArray.length > 1)
                            multyiPolygonArray.push(polygonArray);
                        else singlePolygonArray = polygonArray;
                    }
                }
                let geojson = {
                    type: "FeatureCollection",
                    features: [
                        {
                            type: "Feature",
                            properties: entityMetadata,
                            geometry: {
                                type: singlePolygonArray
                                    ? "Polygon"
                                    : "MultiPolygon",
                                coordinates: singlePolygonArray
                                    ? singlePolygonArray
                                    : multyiPolygonArray
                            }
                        }
                    ]
                };
return geojson;
            });
        });
    }

 function ParseEncodedValue(value) {
        var safeCharacters =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";
        var list = new Array();
        var index = 0;
        var xsum = 0;
        var ysum = 0;
        var max = 4294967296;

        while (index < value.length) {
            var n = 0;
            var k = 0;

            while (1) {
                if (index >= value.length) {
                    return null;
                }
                var b = safeCharacters.indexOf(value.charAt(index++));
                if (b == -1) {
                    return null;
                }
                var tmp = (b & 31) * Math.pow(2, k);

                var ht = tmp / max;
                var lt = tmp % max;

                var hn = n / max;
                var ln = n % max;

                var nl = (lt | ln) >>> 0;
                n = (ht | hn) * max + nl;
                k += 5;
                if (b < 32) break;
            }

            var diagonal = parseInt((Math.sqrt(8 * n + 5) - 1) / 2);
            n -= (diagonal * (diagonal + 1)) / 2;
            var ny = parseInt(n);
            var nx = diagonal - ny;
            nx = (nx >> 1) ^ -(nx & 1);
            ny = (ny >> 1) ^ -(ny & 1);
            xsum += nx;
            ysum += ny;
            var lat = ysum * 0.00001;
            var lon = xsum * 0.00001;
            list.push([lon, lat]);
        }
        return list;
    }