给定Lat / Lng得到多边形

时间:2014-09-14 07:18:31

标签: c# google-maps gis

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

我知道使用Google Maps API我可以获得政治领域等几个信息,但我怎样才能获得定义它们的多边形?

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

最好我想在控制台应用程序中使用。

1 个答案:

答案 0 :(得分:0)

感谢 Steve Benett 的评论,我终于得到了线索的开头,这让我得到了答案。

首先我开始使用proposed link,这导致我点击了SO like question帮助页面上的openstreetmap

之后我问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);
    });
});

已知问题

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

  • 如果您更改区域,则它不会清除上一个区域并稍微连接它们。