Add query syntax and methods

This commit is contained in:
savsch 2024-12-23 18:46:24 +05:30
parent a19ce3e208
commit df8a973079
5 changed files with 103 additions and 5 deletions

View file

@ -2,6 +2,7 @@ package fr.free.nrw.commons.mwapi
import android.text.TextUtils import android.text.TextUtils
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.JsonParser
import fr.free.nrw.commons.BuildConfig import fr.free.nrw.commons.BuildConfig
import fr.free.nrw.commons.campaigns.CampaignResponseDTO import fr.free.nrw.commons.campaigns.CampaignResponseDTO
import fr.free.nrw.commons.explore.depictions.DepictsClient import fr.free.nrw.commons.explore.depictions.DepictsClient
@ -330,6 +331,74 @@ class OkHttpJsonApiClient @Inject constructor(
throw Exception(response.message) throw Exception(response.message)
} }
@Throws(Exception::class)
fun getNearbyItemCount(
screenTopRight: LatLng, screenBottomLeft: LatLng
): Int {
val wikidataQuery: String =
FileUtils.readFromResource("/queries/rectangle_query_for_item_count.rq")
val westCornerLat = screenTopRight.latitude
val westCornerLong = screenTopRight.longitude
val eastCornerLat = screenBottomLeft.latitude
val eastCornerLong = screenBottomLeft.longitude
val query = wikidataQuery
.replace("\${LAT_WEST}", String.format(Locale.ROOT, "%.4f", westCornerLat))
.replace("\${LONG_WEST}", String.format(Locale.ROOT, "%.4f", westCornerLong))
.replace("\${LAT_EAST}", String.format(Locale.ROOT, "%.4f", eastCornerLat))
.replace("\${LONG_EAST}", String.format(Locale.ROOT, "%.4f", eastCornerLong))
val urlBuilder: HttpUrl.Builder = sparqlQueryUrl.toHttpUrlOrNull()!!
.newBuilder()
.addQueryParameter("query", query)
.addQueryParameter("format", "json")
val request: Request = Request.Builder()
.url(urlBuilder.build())
.build()
val response = okHttpClient.newCall(request).execute()
if (response.body != null && response.isSuccessful) {
val json = response.body!!.string()
return JsonParser.parseString(json).getAsJsonObject().getAsJsonObject("results")
.getAsJsonArray("bindings").get(0).getAsJsonObject().getAsJsonObject("count")
.get("value").asInt
}
throw Exception(response.message)
}
@Throws(Exception::class)
fun getNearbyItemCount(
center: LatLng, radius: Double
): Int {
val wikidataQuery: String =
FileUtils.readFromResource("/queries/radius_query_for_item_count.rq")
val query = wikidataQuery
.replace("\${LAT}", String.format(Locale.ROOT, "%.4f", center.latitude))
.replace("\${LONG}", String.format(Locale.ROOT, "%.4f", center.longitude))
.replace("\${RAD}", String.format(Locale.ROOT, "%.2f", radius))
val urlBuilder: HttpUrl.Builder = sparqlQueryUrl.toHttpUrlOrNull()!!
.newBuilder()
.addQueryParameter("query", query)
.addQueryParameter("format", "json")
val request: Request = Request.Builder()
.url(urlBuilder.build())
.build()
val response = okHttpClient.newCall(request).execute()
if (response.body != null && response.isSuccessful) {
val json = response.body!!.string()
return JsonParser.parseString(json).getAsJsonObject().getAsJsonObject("results")
.getAsJsonArray("bindings").get(0).getAsJsonObject().getAsJsonObject("count")
.get("value").asInt
}
throw Exception(response.message)
}
@Throws(Exception::class) @Throws(Exception::class)
fun getNearbyPlaces( fun getNearbyPlaces(
screenTopRight: LatLng, screenTopRight: LatLng,

View file

@ -196,8 +196,9 @@ public class NearbyController extends MapController {
return null; return null;
} }
List<Place> places = nearbyPlaces.getFromWikidataQuery(screenTopRight, screenBottomLeft, List<Place> places = nearbyPlaces.getFromWikidataQuery(currentLatLng, screenTopRight,
Locale.getDefault().getLanguage(), shouldQueryForMonuments, customQuery); screenBottomLeft, Locale.getDefault().getLanguage(), shouldQueryForMonuments,
customQuery);
if (null != places && places.size() > 0) { if (null != places && places.size() > 0) {
LatLng[] boundaryCoordinates = { LatLng[] boundaryCoordinates = {

View file

@ -101,6 +101,7 @@ public class NearbyPlaces {
* Retrieves a list of places from a Wikidata query based on screen coordinates and optional * Retrieves a list of places from a Wikidata query based on screen coordinates and optional
* parameters. * parameters.
* *
* @param centerPoint The center of the map, used for radius queries if required.
* @param screenTopRight The top right corner of the screen (latitude, longitude). * @param screenTopRight The top right corner of the screen (latitude, longitude).
* @param screenBottomLeft The bottom left corner of the screen (latitude, longitude). * @param screenBottomLeft The bottom left corner of the screen (latitude, longitude).
* @param lang The language for the query. * @param lang The language for the query.
@ -111,13 +112,22 @@ public class NearbyPlaces {
* @throws Exception If an error occurs during the retrieval process. * @throws Exception If an error occurs during the retrieval process.
*/ */
public List<Place> getFromWikidataQuery( public List<Place> getFromWikidataQuery(
final fr.free.nrw.commons.location.LatLng centerPoint,
final fr.free.nrw.commons.location.LatLng screenTopRight, final fr.free.nrw.commons.location.LatLng screenTopRight,
final fr.free.nrw.commons.location.LatLng screenBottomLeft, final String lang, final fr.free.nrw.commons.location.LatLng screenBottomLeft, final String lang,
final boolean shouldQueryForMonuments, final boolean shouldQueryForMonuments,
@Nullable final String customQuery) throws Exception { @Nullable final String customQuery) throws Exception {
return okHttpJsonApiClient if (customQuery != null){
.getNearbyPlaces(screenTopRight, screenBottomLeft, lang, shouldQueryForMonuments, return okHttpJsonApiClient
customQuery); .getNearbyPlaces(screenTopRight, screenBottomLeft, lang, shouldQueryForMonuments,
customQuery);
}
final double east = screenTopRight.getLongitude();
final double west = screenBottomLeft.getLongitude();
final double north = screenTopRight.getLatitude();
final double south = screenBottomLeft.getLatitude();
return new java.util.ArrayList<Place>(); // TODO replace with actual method call
} }
/** /**

View file

@ -0,0 +1,9 @@
SELECT (COUNT(?item) AS ?itemCount)
WHERE {
# Around given location.
SERVICE wikibase:around {
?item wdt:P625 ?location.
bd:serviceParam wikibase:center "Point(${LONG} ${LAT})"^^geo:wktLiteral.
bd:serviceParam wikibase:radius "${RAD}" . # Radius in kilometers.
}
}

View file

@ -0,0 +1,9 @@
SELECT (COUNT(DISTINCT ?item) AS ?count)
WHERE {
SERVICE wikibase:box {
?item wdt:P625 ?location.
bd:serviceParam wikibase:cornerWest "Point(${LONG_WEST} ${LAT_WEST})"^^geo:wktLiteral.
bd:serviceParam wikibase:cornerEast "Point(${LONG_EAST} ${LAT_EAST})"^^geo:wktLiteral.
}
}
&format=json