【问题标题】:Given Lat/Lng get polygon给定 Lat/Lng 得到多边形
【发布时间】:2014-09-14 07:18:31
【问题描述】:

有没有办法使用 Google Maps API 或任何其他 API 来了解它所在区域的特定点并获取该区域的多边形?

我知道使用 Google Maps API 我可以获得多个信息,例如政治区域等,但我如何获得定义它们的多边形?

我有兴趣了解地区或城市的边界,而不是国家/地区的边界。

最好我想在控制台应用程序中使用一些东西。

【问题讨论】:

  • @SteveBennett 谢谢你,但我已经看过了。它声明它有国家信息,尽管我对城市/地区感兴趣。
  • 好的,知道了。我知道的唯一具有这种功能的服务是 OSM 的 Overpass API。看看*.com/questions/14499511/…
  • 听起来很有希望。 :-) 我很快就会看看。
  • @SteveBenett 您的 cmets 帮了大忙。非常感谢。

标签: c# google-maps gis


【解决方案1】:

感谢Steve Benett的cmets,我终于得到了引导我答案的线程的开始。

首先我登录了proposed link,这导致我在openstreetmap 的帮助页面上点击了SO like question

在那之后我问了my own question,希望有人能提供有关我正在寻找的更相关的信息。

就在那里,我得到了另一条评论,建议我使用他们的Nominatim service 来获取给定坐标所属区域的名称。

有了这些信息,我可以使用相同的服务来请求定义该区域的多边形。

最后,对于想要查看示例的人,我使用这些服务创建了一个jsfiddle。只需在两个输入框中填写您要检查的点的 lat 和 lng,您最终会得到一张标有请求区域的地图。

以防 jsfiddle 出错,这是我的代码。它并不完美,但可以完成工作。有一些已知问题(检查这些代码后):

HTML

<div>
    <input type="text" id="lat" value="36.5100710" />
    <input type="text" id="lng" value="-4.8824474" />
    <button id="btn">Submit</button>
</div>
<div>
    <div id="map" style="width: 500px; height: 400px;"></div>
    <script src="http://maps.google.com/maps/api/js?sensor=false"></script>
</div>

JS

var boundingbox = [];
var geojson = [];
var getMap = function (lat, lng) {
    $.ajax({
        url: 'http://nominatim.openstreetmap.org/reverse',
        data: {
            format: 'json',
            lat: lat,
            lon: lng
        },
        type: 'GET'
    }).success(function (region) {
        //console.log(region);
        $.ajax({
            url: 'http://nominatim.openstreetmap.org/search',
            data: {
                format: 'json',
                country: region.address.country,
                state: region.address.state,
                polygon_geojson: 1
            },
            type: 'GET'
        }).success(function (data) {
            boundingbox = data[0].boundingbox;
            if (data[0].geojson.type == 'Polygon') {
                console.log(data[0].geojson.coordinates[0]);
                $.each(data[0].geojson.coordinates[0], function (i) {
                    geojson.push(new google.maps.LatLng(data[0].geojson.coordinates[0][i][1], data[0].geojson.coordinates[0][i][0]));
                });
            } else {
                console.log(data[0].geojson.coordinates[0][0]);
                $.each(data[0].geojson.coordinates[0][0], function (i) {
                    geojson.push(new google.maps.LatLng(data[0].geojson.coordinates[0][0][i][1], data[0].geojson.coordinates[0][0][i][0]));
                });
            }
            //console.log([boundingbox, geojson]);
        }).then(function () {
            var map = new google.maps.Map(document.getElementById('map'), {
                //zoom: 12,
                //center: new google.maps.LatLng(52.2265968, 4.5504552),
                mapTypeId: google.maps.MapTypeId.ROADMAP
            });

            var infowindow = new google.maps.InfoWindow();

            var requestedPolygon = new google.maps.Polygon({
                paths: geojson,
                strokeColor: '#FF0000',
                strokeOpacity: 0.8,
                strokeWeight: 2,
                fillColor: '#FF0000',
                fillOpacity: 0.35
            });
            //console.log(bermudaTriangle);
            requestedPolygon.setMap(map);
            var a = new google.maps.LatLng(parseFloat(boundingbox[0]), parseFloat(boundingbox[2]));
            var b = new google.maps.LatLng(parseFloat(boundingbox[1]), parseFloat(boundingbox[3]));;
            var bounds = new google.maps.LatLngBounds();
            bounds.extend(a);
            bounds.extend(b);
            map.fitBounds(bounds);

        })
    })
}
$(function () {
    $("#btn").click(function () {
        console.log("s");
        var lat = $("#lat").val();
        var lng = $("#lng").val();
        getMap(lat, lng);
    });
});

已知问题

  • 在某些情况下,返回的类型是一个多边形,实际上是一个多边形数组。在我的示例中,我只得到了第一个多边形,这是错误的,但这只是一个展示案例,而不是最终解决方案。

  • 如果您更改区域,则它不会清除先前的区域并在某种程度上将它们连接起来。

【讨论】: