使用谷歌地理定位API确定标签是否指向城镇级别的位置


Determining if a hashtag refers to a location at the town/city level using the Google geolocation APIs

所以我正在制作一项服务,搜索特定的标签,然后尝试将这些推文的来源放在地图上。

有三种方法可以确定位置。一种是对地理位置数据进行反向查找,该数据仅在推特的一小部分(<10%)上可用。第二个是在推文中查找指定位置的标签,第三个是查看用户档案。

我目前遇到的问题是第二个。我提取推文和缓存结果没有问题,但结果目前非常模糊,因为谷歌是一个很好的搜索引擎。例如,如果我搜索"followme"(显然无意被解释为地址),谷歌就会在澳大利亚维多利亚州找到一条名为"followme"的街道。

基本上,我想做的只是在城镇或城市层面进行搜索,以减少误报的数量。但我一直找不到任何可以帮助我的文件。

编辑:或者,是否有支持此类功能的地图提供商?

编辑2:响应代码请求和更多解释。

代码可能不完整,没有太大帮助。你真正需要知道的是:

  1. 它像在cron中一样运行,目的是填充数据库
  2. 它将查询twitter API,查找特定的标签
  3. 如果它找不到任何地理位置数据(需要用户专门启用)来对地址进行反向查找,那么它就只能依靠推文正文中的标签了
  4. 我将过滤该数据以删除重复项,并忽略数据库中已经存在的任何术语
  5. 在剩下的项目上,我需要对这些标签(格式化为术语列表)进行地址搜索,看看其中是否有与城镇或城市名称匹配的标签如果我只是直接搜索,那么我会得到一大堆误报

http://pastebin.com/HX2vt0Mh

以假阳性为例。如果我输入源自标签"#followme"的"followme‎,Lysterfield VIC 3156,Australia"。如果我将搜索限制在城镇级别,那么假阳性应该会降到可接受的水平。

您可以看到:

  1. Geocoder

  2. 并通过GeocodingAddressTypes 过滤GeocodeResult

考虑以下示例(并查看Chrome的控制台):

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Geocoding service</title>
    <style>
      html, body, #map-canvas { height: 100%; min-height: 600px; min-width: 700px; margin: 0px; padding: 0px }
      #panel { position: absolute; top: 5px; left: 50%; margin-left: -180px; z-index: 5; background-color: #fff; padding: 5px; border: 1px solid #999; }
    </style>
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
</head>
<body>
    <div id="panel">
      <input id="address" type="textbox" value="followme">
      <input type="button" value="Geocode" onclick="codeAddress()">
    </div>
    <div id="map-canvas"></div>
    <script>
        var geocoder;
        var map;
        var filterTypes = ["country", "administrative_area_level_1", "administrative_area_level_2", "administrative_area_level_3", "locality"];
        function initialize() {
            geocoder = new google.maps.Geocoder();
            var latlng = new google.maps.LatLng(-34.397, 150.644);
            var mapOptions = {
                zoom: 8,
                center: latlng
            };
            map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
        }
        function codeAddress() {
            var address = document.getElementById('address').value;
            geocoder.geocode({ 'address': address }, function (results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    for (var i = 0;i < results.length; i++) {
                        var resultTypes = results[i].types;
                        for (var j = 0; j < resultTypes.length; j++) {
                            for (var type in filterTypes) {
                                if (filterTypes[type] == resultTypes[j]) {
                                    map.setCenter(results[0].geometry.location);
                                    var marker = new google.maps.Marker({
                                        map: map,
                                        //draggable: true,
                                        position: results[0].geometry.location
                                    });
                                    console.log("The result is of good type");
                                } 
                                console.log(resultTypes[j]);
                            }
                        }
                    }
                } else {
                    alert('Geocode was not successful for the following reason: ' + status);
                }
            });
        }
        google.maps.event.addDomListener(window, 'load', initialize);
    </script>
</body>
</html>

作为另一个选项,你可以看看这个:

  1. 放置

  2. 文本搜索请求

  3. 并按supported_types#table2 过滤PlaceResult