forked from watmildon/SmallCityMastodonBot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOverpassQueryBuilder.cs
More file actions
64 lines (50 loc) · 2.23 KB
/
OverpassQueryBuilder.cs
File metadata and controls
64 lines (50 loc) · 2.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using GeoCoordinatePortable;
using Newtonsoft.Json;
using SmallCityMastodonBot;
using System.Text;
using System.Xml.Serialization;
namespace overpass_parser
{
public class OverpassQueryBuilder
{
private readonly HttpClient httpClient;
public OverpassQueryBuilder(HttpClient httpClient)
{
this.httpClient = httpClient;
}
public string CreateCountQuery(double latitude, double longitude, string tagKey, string radiusInMeters)
{
return $"[out:json][timeout:25];(nwr(around:{radiusInMeters}.00,{latitude},{longitude})[\"{tagKey}\"];);out count;";
}
private static long lastQueryTime = DateTime.MinValue.Ticks / TimeSpan.TicksPerMillisecond;
private static readonly long queryThrottle = 500;
public string SendQuery(string overpassQuery)
{
long currentTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
if (currentTime - lastQueryTime < queryThrottle)
{
Thread.Sleep((int)(queryThrottle - (currentTime - lastQueryTime)));
Console.WriteLine($"Slept for {(queryThrottle - (currentTime - lastQueryTime)) / 1000.0} seconds");
}
// URL for the Overpass API endpoint
string overpassUrl = "https://overpass-api.de/api/interpreter";
// set up the request
HttpRequestMessage request = new(HttpMethod.Post, overpassUrl);
request.Headers.Add("User-Agent", Program.userAgent);
request.Content = new StringContent(overpassQuery);
// record time we sent the query
lastQueryTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
// send the query
HttpResponseMessage response = httpClient.Send(request);
response.EnsureSuccessStatusCode();
var contentTask = response.Content.ReadAsStringAsync();
contentTask.Wait();
return contentTask.Result;
}
public int SendCountQuery(string overpassQuery)
{
var jsonResult = SendQuery(overpassQuery);
return Int32.Parse(JsonConvert.DeserializeObject<CountQueryData>(jsonResult).elements[0].tags.total);
}
}
}