如何将推文限制在特定位置
How to limit tweets to only specific Location
我正在尝试通过特定位置搜索 Twitter。我已经设法让它排除任何在我的半径之外进行地理标记的推文,但我也收到了绝大多数地理数据设置为空的推文。
var Twitter = new LinqToTwitter.TwitterContext(auth);
var GeoCode = new LinqToTwitter.Geo()
{
Latitude = 37.68,
Longitude = -97.33,
Accuracy = "20mi"
};
var geostring = $"{GeoCode.Latitude},{GeoCode.Longitude},{GeoCode.Accuracy}";
var searchResponse =
Twitter.Search
.Where(x => x.Type == SearchType.Search)
.Where(x => x.Query == "Trump") //I know people are tweeting this right now...
.Where(x => x.GeoCode == geostring)
.FirstOrDefault();
现在,如前所述,这排除了特别标记为在我的位置和半径之外的推文,但我还想排除没有位置数据集的推文。我是不是做错了什么,还是我只需要提取不需要的数据然后在事后过滤它?
我不认为你应该以那种方式组合 wheres,试试:
var searchResponse =
Twitter.Search
.Where(x => x.Type == SearchType.Search &&
x.Query == "Trump" &&
x.GeoCode == geostring)
.FirstOrDefault();
您看到很多坐标为零的原因是因为很多人在他们的个人资料中关闭了位置信息。 Twitter Search API 上没有排除空位置的选项。不过,您可以执行查询,然后执行 LINQ to Objects 查询来过滤结果,如下所示:
var searchResponse =
await
Twitter.Search
.Where(x => x.Type == SearchType.Search)
.Where(x => x.Query == "Trump") //I know people are tweeting this right now...
.Where(x => x.GeoCode == geostring)
.FirstOrDefaultAsync();
var withGeoCode =
(from resp in searchResponse.Statuses
where resp.Coordinates.Latitude != 0 && resp.Coordinates.Longitude != 0
select resp)
.ToList();
顺便说一句,请注意 LINQ to Twitter 是 async
,这就是我添加 async
关键字和 FirstOrDefaultAsync
运算符的原因。否则,您 运行 有可能因为竞争条件而出错或收不到结果。有时,我惊讶地发现 non-async 运算符仍然有效。
如果推文不是 geo-tagged,Coordinates
Latitude
/Longitude
属性将为 0,您可以在上面的代码中看到。
如果您搜索特定地点 ID,那么您将只会收到来自该地点或更窄地点的带有地理标签的推文。例如如果您搜索旧金山 (5a110d312052166f)、加利福尼亚或美国,将返回旧金山的推文。您还将收到有关旧金山街区的推文。
n.b。这将是少量的推文,因为大多数推文都没有地理标记。
搜索 place:ID 例如place:402e618bff0d9dc1
https://api.twitter.com/1.1/search/tweets.json?q=place%3A5a110d312052166f
您可以在网站上自行测试
https://twitter.com/search?q=place%3A5a110d312052166f&src=typd
我正在尝试通过特定位置搜索 Twitter。我已经设法让它排除任何在我的半径之外进行地理标记的推文,但我也收到了绝大多数地理数据设置为空的推文。
var Twitter = new LinqToTwitter.TwitterContext(auth);
var GeoCode = new LinqToTwitter.Geo()
{
Latitude = 37.68,
Longitude = -97.33,
Accuracy = "20mi"
};
var geostring = $"{GeoCode.Latitude},{GeoCode.Longitude},{GeoCode.Accuracy}";
var searchResponse =
Twitter.Search
.Where(x => x.Type == SearchType.Search)
.Where(x => x.Query == "Trump") //I know people are tweeting this right now...
.Where(x => x.GeoCode == geostring)
.FirstOrDefault();
现在,如前所述,这排除了特别标记为在我的位置和半径之外的推文,但我还想排除没有位置数据集的推文。我是不是做错了什么,还是我只需要提取不需要的数据然后在事后过滤它?
我不认为你应该以那种方式组合 wheres,试试:
var searchResponse =
Twitter.Search
.Where(x => x.Type == SearchType.Search &&
x.Query == "Trump" &&
x.GeoCode == geostring)
.FirstOrDefault();
您看到很多坐标为零的原因是因为很多人在他们的个人资料中关闭了位置信息。 Twitter Search API 上没有排除空位置的选项。不过,您可以执行查询,然后执行 LINQ to Objects 查询来过滤结果,如下所示:
var searchResponse =
await
Twitter.Search
.Where(x => x.Type == SearchType.Search)
.Where(x => x.Query == "Trump") //I know people are tweeting this right now...
.Where(x => x.GeoCode == geostring)
.FirstOrDefaultAsync();
var withGeoCode =
(from resp in searchResponse.Statuses
where resp.Coordinates.Latitude != 0 && resp.Coordinates.Longitude != 0
select resp)
.ToList();
顺便说一句,请注意 LINQ to Twitter 是 async
,这就是我添加 async
关键字和 FirstOrDefaultAsync
运算符的原因。否则,您 运行 有可能因为竞争条件而出错或收不到结果。有时,我惊讶地发现 non-async 运算符仍然有效。
如果推文不是 geo-tagged,Coordinates
Latitude
/Longitude
属性将为 0,您可以在上面的代码中看到。
如果您搜索特定地点 ID,那么您将只会收到来自该地点或更窄地点的带有地理标签的推文。例如如果您搜索旧金山 (5a110d312052166f)、加利福尼亚或美国,将返回旧金山的推文。您还将收到有关旧金山街区的推文。
n.b。这将是少量的推文,因为大多数推文都没有地理标记。
搜索 place:ID 例如place:402e618bff0d9dc1
https://api.twitter.com/1.1/search/tweets.json?q=place%3A5a110d312052166f
您可以在网站上自行测试
https://twitter.com/search?q=place%3A5a110d312052166f&src=typd