commit d81a830e3f54bd662686370f44d68bb9db0d7ffb Author: Hubert Van De Walle Date: Sat Sep 26 13:28:46 2020 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eff7b80 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +target/ +.idea/ +*.iml +*.ipr +*.iws diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d7fc843 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM openjdk:14-alpine as jdkbuilder +RUN apk add --no-cache binutils +ENV MODULES java.base,java.compiler,java.desktop,java.logging,java.management,java.naming,java.security.jgss,java.xml,jdk.crypto.ec,jdk.unsupported +RUN jlink --output /myjdk --module-path $JAVA_HOME/jmods --add-modules $MODULES --no-header-files --no-man-pages --strip-debug --compress=2 +RUN strip -p --strip-unneeded /myjdk/lib/server/libjvm.so + +FROM maven:3.6.3-jdk-14 as builder +WORKDIR /app +COPY pom.xml . +RUN mvn verify clean --fail-never +COPY src/main src/main +RUN mvn package + +FROM alpine +ENV APPLICATION_USER app +RUN adduser -D -g '' $APPLICATION_USER +RUN mkdir /app +RUN chown -R $APPLICATION_USER /app +USER $APPLICATION_USER +COPY --from=builder /app/target/c2c*.jar /app/app.jar +COPY --from=jdkbuilder /myjdk /myjdk +WORKDIR /app +EXPOSE 4000 +CMD ["/myjdk/bin/java", "-server", "-XX:+UseG1GC", "-XX:+UseStringDeduplication", "-jar", "app.jar"] diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5db1ea3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,227 @@ + + 4.0.0 + be.simplenotes.c2c + c2c + 1.0-SNAPSHOT + + 14 + 1.4.10 + ${java.version} + ${java.version} + UTF-8 + be.simplenotes.c2c/C2cKt + 1.0.4 + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.koin + koin-core + 2.1.6 + + + org.http4k + http4k-core + 3.261.0 + + + org.http4k + http4k-contract + 3.261.0 + + + org.http4k + http4k-format-jackson + 3.261.0 + + + org.http4k + http4k-server-apache + 3.261.0 + + + org.http4k + http4k-client-apache + 3.261.0 + + + ch.qos.logback + logback-classic + 1.2.3 + + + com.github.ben-manes.caffeine + caffeine + 2.8.5 + + + org.jsoup + jsoup + 1.13.1 + + + com.openhtmltopdf + openhtmltopdf-core + ${openhtml.version} + + + com.openhtmltopdf + openhtmltopdf-pdfbox + ${openhtml.version} + + + com.mitchellbosecke + pebble + 2.4.0 + + + org.junit.jupiter + junit-jupiter + 5.7.0 + test + + + org.junit.jupiter + junit-jupiter-params + 5.7.0 + test + + + org.assertj + assertj-core + 3.17.2 + test + + + io.mockk + mockk + 1.10.0 + test + + + + + jcenter + https://jcenter.bintray.com + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-stdlib-jdk7 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-stdlib-common + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.2 + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M4 + + + org.apache.maven.surefire + surefire-junit-platform + 3.0.0-M4 + + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + false + false + + + ${main.class} + + + + + com.github.ben-manes.caffeine:caffeine + + ** + + + + org.jetbrains.kotlin:kotlin-reflect + + ** + + + + + + + + + + diff --git a/src/main/kotlin/C2c.kt b/src/main/kotlin/C2c.kt new file mode 100644 index 0000000..ede849f --- /dev/null +++ b/src/main/kotlin/C2c.kt @@ -0,0 +1,102 @@ +package be.simplenotes.c2c + +import be.simplenotes.c2c.api.Api +import be.simplenotes.c2c.api.ApiUrls +import be.simplenotes.c2c.pdf.PdfCreator +import be.simplenotes.c2c.pdf.StreamFactory +import be.simplenotes.c2c.routes.IndexRoute +import be.simplenotes.c2c.routes.PdfRoute +import be.simplenotes.c2c.routes.RouteRoute +import be.simplenotes.c2c.routes.SearchRoute +import com.mitchellbosecke.pebble.PebbleEngine +import com.mitchellbosecke.pebble.loader.ClasspathLoader +import org.apache.hc.client5.http.impl.DefaultRedirectStrategy +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder +import org.http4k.client.ApacheClient +import org.http4k.contract.ContractRoute +import org.http4k.contract.contract +import org.http4k.contract.openapi.ApiInfo +import org.http4k.contract.openapi.v3.OpenApi3 +import org.http4k.core.Filter +import org.http4k.core.Response +import org.http4k.core.Status +import org.http4k.core.then +import org.http4k.filter.RequestFilters +import org.http4k.filter.ServerFilters +import org.http4k.format.Jackson +import org.http4k.server.asServer +import org.koin.core.context.startKoin +import org.koin.core.qualifier.named +import org.koin.dsl.bind +import org.koin.dsl.module +import org.slf4j.LoggerFactory +import java.io.PrintWriter +import java.io.StringWriter + +val module = module { + single { + ApacheClient( + HttpClientBuilder + .create() + .setRedirectStrategy(DefaultRedirectStrategy()) + .build() + ) + } + single { ApiUrls(get()) } + single { Jackson.mapper } + single { Api(get(), get()) } + single { PdfCreator(get()) } + single { StreamFactory(get()) } + single { + PebbleEngine + .Builder() + .loader(ClasspathLoader().apply { + prefix = "views/" + suffix = ".twig" + }) + .cacheActive(false) + .build() + } +} + +val routes = module { + single(named()) { SearchRoute(get()).searchRoute() } bind ContractRoute::class + single(named()) { RouteRoute(get()).routeRoute() } bind ContractRoute::class + single(named()) { PdfRoute(get(), get()).route() } bind ContractRoute::class + single(named()) { IndexRoute(get()).route() } bind ContractRoute::class +} + +fun main() { + val koin = startKoin { + modules(module, routes) + }.koin + + val appRoutes = koin.getAll() + val app = contract { + renderer = OpenApi3(ApiInfo("Camp2Camp", "1.0-SNAPSHOT"), Jackson) + descriptionPath = "/api/swagger.json" + routes.all.addAll(appRoutes) + } + + val logger = LoggerFactory.getLogger("Camp2Camp") + + val loggingFilter = RequestFilters.Tap { + logger.info("${it.method} ${it.uri}") + } + + val catchAll = Filter { next -> + { + try { + next(it) + } catch (e: Exception) { + val sw = StringWriter() + e.printStackTrace(PrintWriter(sw)) + logger.error(sw.toString()) + Response(Status.INTERNAL_SERVER_ERROR) + } + } + } + + catchAll.then(ServerFilters.GZip()).then(loggingFilter).then(app).asServer(CustomApacheServer(4000)).start() + logger.info("Listening on http://localhost:4000") +} diff --git a/src/main/kotlin/CustomApacheServer.kt b/src/main/kotlin/CustomApacheServer.kt new file mode 100644 index 0000000..400c8b4 --- /dev/null +++ b/src/main/kotlin/CustomApacheServer.kt @@ -0,0 +1,33 @@ +package be.simplenotes.c2c + +import org.apache.hc.core5.http.impl.bootstrap.ServerBootstrap +import org.apache.hc.core5.http.io.SocketConfig +import org.http4k.core.HttpHandler +import org.http4k.server.Http4kRequestHandler +import org.http4k.server.Http4kServer +import org.http4k.server.ServerConfig + +class CustomApacheServer(val port: Int) : ServerConfig { + override fun toServer(httpHandler: HttpHandler): Http4kServer = object : Http4kServer { + val handler = Http4kRequestHandler(httpHandler) + + val server = ServerBootstrap.bootstrap() + .setListenerPort(port) + .setSocketConfig(SocketConfig.custom() + .setTcpNoDelay(true) + .setSoKeepAlive(true) + .setSoReuseAddress(true) + .setBacklogSize(1000) + .build()) + .apply { + register("*", handler) + registerVirtual("dev.simplenotes.be", "*", handler) // TODO: find a way to put a wildcard + }.create() + + override fun start() = apply { server.start() } + + override fun stop() = apply { server.stop() } + + override fun port(): Int = port + } +} diff --git a/src/main/kotlin/api/Api.kt b/src/main/kotlin/api/Api.kt new file mode 100644 index 0000000..fbbf5e5 --- /dev/null +++ b/src/main/kotlin/api/Api.kt @@ -0,0 +1,44 @@ +package be.simplenotes.c2c.api + +import be.simplenotes.c2c.extractors.extractRoute +import be.simplenotes.c2c.extractors.extractRoutes +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.benmanes.caffeine.cache.Caffeine +import org.checkerframework.checker.nullness.qual.Nullable +import org.http4k.format.Jackson +import org.slf4j.LoggerFactory +import java.util.concurrent.TimeUnit + +class Api(private val apiUrls: ApiUrls, private val mapper: ObjectMapper = Jackson.mapper) { + private val searchCache = Caffeine.newBuilder() + .maximumSize(100) + .expireAfterWrite(15, TimeUnit.MINUTES) + .build() + + fun cachedSearch(terms: String) = searchCache[terms, ::search]!! + + private fun search(terms: String): SearchResults { + val root = mapper.readTree(apiUrls.search(terms)) + val routes = root["routes"]["documents"].map(::extractRoutes) + return SearchResults(routes) + } + + private val routeCache = Caffeine.newBuilder() + .maximumSize(100) + .recordStats() + .expireAfterWrite(15, TimeUnit.MINUTES) + .build() + + private val logger = LoggerFactory.getLogger("API") + + fun getRoute(id: String): Route? { + val res = routeCache.get(id) { + apiUrls.getRoute(it)?.let { json -> + extractRoute(mapper.readTree(json)) + } + } + logger.info("Cache: ${routeCache.stats()}") + return res + } + +} diff --git a/src/main/kotlin/api/ApiUrls.kt b/src/main/kotlin/api/ApiUrls.kt new file mode 100644 index 0000000..cf1de4e --- /dev/null +++ b/src/main/kotlin/api/ApiUrls.kt @@ -0,0 +1,19 @@ +package be.simplenotes.c2c.api + +import org.http4k.core.HttpHandler +import org.http4k.core.Method +import org.http4k.core.Request +import org.http4k.urlEncoded + +class ApiUrls(private val client: HttpHandler) { + private val baseUrl = "https://api.camptocamp.org" + + private fun get(url: String): String? { + val res = client(Request(Method.GET, "$baseUrl$url")) + return if(res.status.successful) res.bodyString() + else null + } + fun search(terms: String) = get("/search?q=${terms.urlEncoded()}&t=w,r&limit=7") + fun getRoute(id: String): String? = get("/routes/${id}?cook=fr") + fun getOuting(id: String) = get("/outings/${id}?cook=fr") +} diff --git a/src/main/kotlin/api/Models.kt b/src/main/kotlin/api/Models.kt new file mode 100644 index 0000000..1881864 --- /dev/null +++ b/src/main/kotlin/api/Models.kt @@ -0,0 +1,85 @@ +package be.simplenotes.c2c.api + +data class SearchResults(val routes: List) + +data class RouteResult( + val id: String, + val title: String, + val summary: String?, + val activities: List, +) + +data class Route( + val id: String, + val title: String, + val summary: String?, + val routeHistory: String, + val description: String, + val remarks: String, + val gear: String, + val activities: List, + val height: Height, + val rating: Rating, + val associations: Associations, +) + +data class Associations( + val outings: List, + val images: List, + val waypoints: List, +) + +data class Image( + val id: String, + val square: String, + val medium: String, + val big: String, + val full: String, + val title: String, +) + +data class Outing( + val id: String, + val title: String, + val dateStart: String, + val dateEnd: String, + val condition: String?, + val quality: String, + val activities: List, +) + +data class Waypoint( + val id: String, + val title: String, + val elevation: String, +) + +data class Height( + val heightDiffDifficulties: String?, + val up: String?, + val down: String?, + val min: String?, + val max: String?, +) + +data class Rating( + val global: String?, + val free: String?, + val required: String?, + val engagement: String?, + val equipmentQuality: String?, +) + +enum class Activity { + SKITOURING, + SNOW_ICE_MIXED, + MOUNTAIN_CLIMBING, + ROCK_CLIMBING, + ICE_CLIMBING, + HIKING, + SNOWSHOEING, + PARAGLIDING, + MOUNTAIN_BIKING, + VIA_FERRATA, + SLACKLINING, +} diff --git a/src/main/kotlin/extractors/Extensions.kt b/src/main/kotlin/extractors/Extensions.kt new file mode 100644 index 0000000..28e740f --- /dev/null +++ b/src/main/kotlin/extractors/Extensions.kt @@ -0,0 +1,8 @@ +package be.simplenotes.c2c.extractors + +import be.simplenotes.c2c.api.Activity +import com.fasterxml.jackson.databind.JsonNode + +fun JsonNode.activities(): List = map { + Activity.valueOf(it.asText().toUpperCase()) +} diff --git a/src/main/kotlin/extractors/LocaleExtractor.kt b/src/main/kotlin/extractors/LocaleExtractor.kt new file mode 100644 index 0000000..a8aec90 --- /dev/null +++ b/src/main/kotlin/extractors/LocaleExtractor.kt @@ -0,0 +1,7 @@ +package be.simplenotes.c2c.extractors + +import com.fasterxml.jackson.databind.JsonNode + +fun extractLocale(locales: JsonNode): JsonNode = locales.find { locale -> + locale["lang"].asText() == "fr" +} ?: locales[0] diff --git a/src/main/kotlin/extractors/RouteExtractor.kt b/src/main/kotlin/extractors/RouteExtractor.kt new file mode 100644 index 0000000..3a6db7b --- /dev/null +++ b/src/main/kotlin/extractors/RouteExtractor.kt @@ -0,0 +1,85 @@ +package be.simplenotes.c2c.extractors + +import be.simplenotes.c2c.api.* +import com.fasterxml.jackson.databind.JsonNode + +fun extractRoutes(node: JsonNode): RouteResult { + val locale = extractLocale(node["locales"]) + + return RouteResult( + id = node["document_id"].asText(), + title = locale["title_prefix"].asText() + " : " + locale["title"].asText(), + summary = locale["summary"].asText(null), + activities = node["activities"].activities(), + ) +} + +fun extractRoute(root: JsonNode): Route { + val locale = extractLocale(root["locales"]) + + return Route( + root["document_id"].asText(), + locale["title_prefix"].asText() + " : " + locale["title"].asText(), + locale["summary"].asText(null), + locale["route_history"].asText(), + locale["description"].asText(), + locale["remarks"].asText(), + locale["gear"].asText(), + root["activities"].activities(), + Height( + root["height_diff_difficulties"].asText(null), + root["height_diff_up"].asText(null), + root["height_diff_down"].asText(null), + root["elevation_min"].asText(null), + root["elevation_max"].asText(null), + ), + Rating( + root["global_rating"].asText(null), + root["rock_free_rating"].asText(null), + root["rock_required_rating"].asText(null), + root["engagement_rating"].asText(null), + root["equipment_rating"].asText(null), + ), + Associations( + extractOutings(root["associations"]["recent_outings"]["documents"]), + extractImages(root["associations"]["images"]), + extractWaypoints(root["associations"]["waypoints"]), + ) + ) + +} + +fun extractOutings(jsonNode: JsonNode) = jsonNode.map { node -> + val locale = extractLocale(node["locales"]) + Outing( + id = node["document_id"].asText(), + title = locale["title"].asText(), + dateStart = node["date_start"].asText(), + dateEnd = node["date_end"].asText(), + condition = node["condition_rating"].asText(null), + quality = node["quality"].asText(), + activities = node["activities"].activities() + ) +} + +fun extractImages(jsonNode: JsonNode) = jsonNode.map { node -> + val locale = extractLocale(node["locales"]) + val filename = node["filename"].asText() + Image( + id = node["document_id"].asText(), + title = locale["title"].asText(), + square = "https://media.camptocamp.org/c2corg-active/${filename.replace(".", "SI.").replace(".svg", ".jpg")}", + medium = "https://media.camptocamp.org/c2corg-active/${filename.replace(".", "MI.").replace(".svg", ".jpg")}", + big = "https://media.camptocamp.org/c2corg-active/${filename.replace(".", "BI.").replace(".svg", ".jpg")}", + full = "https://media.camptocamp.org/c2corg-active/$filename", + ) +} + +fun extractWaypoints(jsonNode: JsonNode) = jsonNode.map { node -> + val locale = extractLocale(node["locales"]) + Waypoint( + id = node["document_id"].asText(), + title = locale["title"].asText(), + elevation = node["elevation"].asText(), + ) +} diff --git a/src/main/kotlin/pdf/PdfCreator.kt b/src/main/kotlin/pdf/PdfCreator.kt new file mode 100644 index 0000000..a92d260 --- /dev/null +++ b/src/main/kotlin/pdf/PdfCreator.kt @@ -0,0 +1,80 @@ +package be.simplenotes.c2c.pdf + +import be.simplenotes.c2c.api.Route +import be.simplenotes.c2c.templates.render +import com.github.benmanes.caffeine.cache.Caffeine +import com.mitchellbosecke.pebble.PebbleEngine +import com.mitchellbosecke.pebble.loader.ClasspathLoader +import com.openhtmltopdf.extend.FSStream +import com.openhtmltopdf.extend.FSStreamFactory +import com.openhtmltopdf.pdfboxout.PdfRendererBuilder +import com.openhtmltopdf.util.XRLog +import org.http4k.core.HttpHandler +import org.http4k.core.Method +import org.http4k.core.Request +import org.jsoup.Jsoup +import org.jsoup.helper.W3CDom +import org.slf4j.LoggerFactory +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.InputStream +import java.util.concurrent.TimeUnit + +class StreamFactory(private val client: HttpHandler) : FSStreamFactory { + private val logger = LoggerFactory.getLogger(javaClass) + + private val imgCache = Caffeine.newBuilder() + .maximumSize(15) + .expireAfterWrite(15, TimeUnit.MINUTES) + .build() + + override fun getUrl(url: String) = object : FSStream { + override fun getStream(): InputStream? { + val bytes = imgCache.get(url) { + logger.info("Downloading $url") + val res = client(Request(Method.GET, url)) + if (res.status.successful) res.body.stream.readAllBytes() + else null + } + return bytes?.inputStream() + } + + override fun getReader() = null + } +} + +class PdfCreator(private val streamFactory: StreamFactory) { + private val engine = PebbleEngine + .Builder() + .loader(ClasspathLoader().apply { + prefix = "templates/" + suffix = ".twig" + }) + .cacheActive(true) + .build() + + fun create(route: Route): ByteArrayInputStream { + val html = engine.render("index", mapOf("route" to route)) + + XRLog.setLoggingEnabled(false) + + val document = W3CDom().fromJsoup(Jsoup.parse(html)) + val out = ByteArrayOutputStream() + + PdfRendererBuilder() + .withW3cDocument(document, "") + .useFastMode() + .toStream(out) + .useProtocolsStreamImplementation(streamFactory, "http", "https") + + .buildPdfRenderer().apply { + layout() + createPDF() + close() + } + + out.close() + return ByteArrayInputStream(out.toByteArray()) + } + +} diff --git a/src/main/kotlin/routes/IndexRoute.kt b/src/main/kotlin/routes/IndexRoute.kt new file mode 100644 index 0000000..4b6bb4b --- /dev/null +++ b/src/main/kotlin/routes/IndexRoute.kt @@ -0,0 +1,24 @@ +package be.simplenotes.c2c.routes + +import be.simplenotes.c2c.templates.render +import com.mitchellbosecke.pebble.PebbleEngine +import org.http4k.contract.ContractRoute +import org.http4k.contract.bindContract +import org.http4k.core.HttpHandler +import org.http4k.core.Method +import org.http4k.core.Response +import org.http4k.core.Status + +class IndexRoute(private val engine: PebbleEngine) { + + fun route(): ContractRoute { + val spec = "/" bindContract Method.GET + + val route: HttpHandler = { + Response(Status.OK).body(engine.render("index")) + } + + return spec to route + } + +} diff --git a/src/main/kotlin/routes/PdfRoute.kt b/src/main/kotlin/routes/PdfRoute.kt new file mode 100644 index 0000000..1c0189b --- /dev/null +++ b/src/main/kotlin/routes/PdfRoute.kt @@ -0,0 +1,38 @@ +package be.simplenotes.c2c.routes + +import be.simplenotes.c2c.api.Api +import be.simplenotes.c2c.pdf.PdfCreator +import org.http4k.contract.ContractRoute +import org.http4k.contract.div +import org.http4k.contract.meta +import org.http4k.core.HttpHandler +import org.http4k.core.Method +import org.http4k.core.Response +import org.http4k.core.Status +import org.http4k.lens.Path + +// TODO: rename.. +class PdfRoute(private val api: Api, private val pdfCreator: PdfCreator) { + + fun route(): ContractRoute { + val spec = "/route" / Path.of("id", "Route's ID") / "pdf" meta { + summary = "Route details" + } bindContract Method.GET + + fun route(id: String, pdf: String): HttpHandler = { + when (val route = api.getRoute(id)) { + null -> Response(Status.NOT_FOUND) + else -> { + val bytes = pdfCreator.create(route) + Response(Status.OK) + .body(bytes) + .header("Content-Type", "application/pdf") + .header("Content-Disposition", "attachment; filename=\"out.pdf\"") + } + } + } + + return spec to ::route + } + +} diff --git a/src/main/kotlin/routes/RouteRoute.kt b/src/main/kotlin/routes/RouteRoute.kt new file mode 100644 index 0000000..3350460 --- /dev/null +++ b/src/main/kotlin/routes/RouteRoute.kt @@ -0,0 +1,31 @@ +package be.simplenotes.c2c.routes + +import be.simplenotes.c2c.api.Api +import be.simplenotes.c2c.api.Route +import org.http4k.contract.ContractRoute +import org.http4k.contract.div +import org.http4k.contract.meta +import org.http4k.core.* +import org.http4k.format.Jackson.auto +import org.http4k.lens.Path + +// TODO: rename.. +class RouteRoute(private val api: Api) { + + fun routeRoute(): ContractRoute { + val responseLens = Body.auto("Route").toLens() + + val spec = "/route" / Path.of("id", "Route's ID") meta { + summary = "Route details" + } bindContract Method.GET + + fun route(id: String): HttpHandler = { + api.getRoute(id)?.let { + Response(Status.OK).with(responseLens of it) + } ?: Response(Status.NOT_FOUND) + } + + return spec to ::route + } + +} diff --git a/src/main/kotlin/routes/SearchRoute.kt b/src/main/kotlin/routes/SearchRoute.kt new file mode 100644 index 0000000..19bba4d --- /dev/null +++ b/src/main/kotlin/routes/SearchRoute.kt @@ -0,0 +1,38 @@ +package be.simplenotes.c2c.routes + +import be.simplenotes.c2c.api.Activity +import be.simplenotes.c2c.api.Api +import be.simplenotes.c2c.api.RouteResult +import be.simplenotes.c2c.api.SearchResults +import org.http4k.contract.ContractRoute +import org.http4k.contract.Tag +import org.http4k.contract.meta +import org.http4k.core.* +import org.http4k.format.Jackson.auto +import org.http4k.lens.Query + +class SearchRoute(private val api: Api) { + + fun searchRoute(): ContractRoute { + val query = Query.required("q", "Search terms") + val responseLens = Body.auto("Search results").toLens() + + val spec = "/search" meta { + summary = "Search routes and waypoints" + tags += Tag("Query") + returning(Status.OK, responseLens to SearchResults(listOf(RouteResult( + id = "57103", + title = "Tour de Bavon : Thor", + summary = "Belle et longue voie équipée sur des dalles compactes qui sort sous le sommet. ", + activities = listOf(Activity.ROCK_CLIMBING), + )))) + } bindContract Method.GET + + val search: HttpHandler = { req: Request -> + Response(Status.OK).with(responseLens of api.cachedSearch(query(req))) + } + + return spec to search + } + +} diff --git a/src/main/kotlin/templates/Templates.kt b/src/main/kotlin/templates/Templates.kt new file mode 100644 index 0000000..d8edcd8 --- /dev/null +++ b/src/main/kotlin/templates/Templates.kt @@ -0,0 +1,11 @@ +package be.simplenotes.c2c.templates + +import com.mitchellbosecke.pebble.PebbleEngine +import java.io.StringWriter + +fun PebbleEngine.render(name: String, args: Map = mapOf()): String { + val template = getTemplate(name) + val writer = StringWriter() + template.evaluate(writer, args) + return writer.toString() +} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..07ed1f7 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,15 @@ + + + true + + %cyan(%d{YYYY-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{36}) - %msg%n + + + + + + + + + + diff --git a/src/main/resources/templates/index.twig b/src/main/resources/templates/index.twig new file mode 100644 index 0000000..88bf5a0 --- /dev/null +++ b/src/main/resources/templates/index.twig @@ -0,0 +1,10 @@ +

{{ route.title }}

+

{{ route.summary }}

+

{{ route.description }}

+{% for img in route.associations.images %} +
+ {{ img.title }} +
{{ img.title }}
+
+{% endfor %} diff --git a/src/main/resources/views/index.twig b/src/main/resources/views/index.twig new file mode 100644 index 0000000..61c6b28 --- /dev/null +++ b/src/main/resources/views/index.twig @@ -0,0 +1,11 @@ + + + + + + Title + + +Hello + + diff --git a/src/test/kotlin/Empty.kt b/src/test/kotlin/Empty.kt new file mode 100644 index 0000000..bc39f09 --- /dev/null +++ b/src/test/kotlin/Empty.kt @@ -0,0 +1 @@ +package be.simplenotes.c2c diff --git a/src/test/kotlin/api/ApiTest.kt b/src/test/kotlin/api/ApiTest.kt new file mode 100644 index 0000000..80b3299 --- /dev/null +++ b/src/test/kotlin/api/ApiTest.kt @@ -0,0 +1,85 @@ +package be.simplenotes.c2c.api + +import be.simplenotes.c2c.extractors.extractLocale +import be.simplenotes.c2c.extractors.extractRoute +import com.fasterxml.jackson.module.kotlin.readValue +import io.mockk.clearMocks +import io.mockk.every +import io.mockk.mockk +import org.assertj.core.api.Assertions.assertThat +import org.http4k.format.Jackson +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.TestInstance +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +internal class ApiTest { + private val urls = mockk() + private val api = Api(urls) + private val mapper = Jackson.mapper + + @BeforeEach + fun beforeEach() { + clearMocks(urls) + } + + @ParameterizedTest + @CsvSource("bavon", "portalet", "test") + fun parseRoutes(fileName: String) { + val file = javaClass.getResource("/search/$fileName").readText() + val (terms, input, output) = file.split("---", limit = 3).map { it.trim() } + every { urls.search(terms) } returns input + val results = api.cachedSearch(terms) + val expectedRoutes = mapper.readValue>(output) + assertThat(results.routes).containsExactlyInAnyOrderElementsOf(expectedRoutes) + } + + @ParameterizedTest + @CsvSource("57103") + fun route(id: String) { + val input = javaClass.getResource("/routes/$id-in.json").readText() + every { urls.getRoute(id) } returns input + // test + val root = mapper.readTree(input) + val route = extractRoute(root) + + root["cooked"].forEach { + println(it.asText()) + } + // + } + + @ParameterizedTest + @CsvSource("bavon") + fun outing(id: String) { + val input = javaClass.getResource("/outings/$id-in.json").readText() + every { urls.getOuting(id) } returns input + // + val json = urls.getOuting(id) + val root = mapper.readTree(json) + + // + + val locale = extractLocale(root["locales"]) + val doc = mapOf( + "id" to root["document_id"].asText(null), + "title" to locale["title"].asText(null), + "weather" to locale["weather"].asText(null), + "conditions_levels" to locale["conditions_levels"].asText(null), + "route_description" to locale["route_description"].asText(null), + "summary" to locale["summary"].asText(null), + "version" to locale["version"].asText(null), + "access_comment" to locale["access_comment"].asText(null), + "timing" to locale["timing"].asText(null), + "participants" to locale["participants"].asText(null), + "hut_comment" to locale["hut_comment"].asText(null), + "topic_id" to locale["topic_id"].asText(null), + "description" to locale["description"].asText(null), + "conditions" to locale["conditions"].asText(null), + ) + + + println(doc.entries.joinToString("\n")) + } +} diff --git a/src/test/resources/document.json b/src/test/resources/document.json new file mode 100644 index 0000000..8559c5d --- /dev/null +++ b/src/test/resources/document.json @@ -0,0 +1,387 @@ +{ + "area":{ + "letter":"a", + "fields":[ + {"id": "title"}, + {"id": "summary"}, + {"id": "description"}, + {"id": "lang", "properties": {"url":"l"}}, + + {"id": "area_type", "properties": {"url":"atyp"}}, + {"id": "quality", "properties": {"url":"qa"}} + ] + }, + + "article":{ + "letter":"c", + "fields":[ + {"id": "title"}, + {"id": "summary"}, + {"id": "description"}, + {"id": "lang", "properties": {"url":"l"}}, + + {"id": "activities", "properties": {"url":"act"}}, + {"id": "article_categories", "properties": {"url":"acat"}}, + {"id": "quality", "properties": {"url":"qa"}}, + {"id": "article_type", "properties": {"url":"atyp"}}, + + {"id": "articles", "properties": {"url":"c", "associationEditorOrder": 1}}, + {"id": "books", "properties": {"url":"b", "associationEditorOrder": 4}}, + {"id": "outings", "properties": {"url":"o", "associationEditorOrder": 5}}, + {"id": "routes", "properties": {"url":"r", "associationEditorOrder": 3}}, + {"id": "waypoints", "properties": {"url":"w", "associationEditorOrder": 2}}, + {"id": "images", "properties":{"associationEditorOrder": 8}}, + {"id": "users", "properties":{"associationEditorOrder": 7}}, + {"id": "xreports", "properties":{"associationEditorOrder": 6}} + ] + }, + + "book":{ + "letter":"b", + "fields":[ + {"id": "title"}, + {"id": "summary"}, + {"id": "description"}, + {"id": "lang", "properties": {"url":"l"}}, + + {"id": "author"}, + {"id": "editor"}, + {"id": "activities", "properties": {"url":"act"}}, + {"id": "url"}, + {"id": "isbn"}, + {"id": "book_types", "properties": {"url":"btyp"}}, + {"id": "publication_date"}, + {"id": "quality", "properties": {"url":"qa"}}, + {"id": "langs"}, + {"id": "nb_pages"}, + + {"id": "articles", "properties": {"url":"c"}}, + {"id": "routes", "properties": {"url":"r"}}, + {"id": "waypoints", "properties": {"url":"w"}}, + {"id": "images"} + ] + }, + + "image":{ + "letter":"i", + "geoLocalized":true, + "fields":[ + {"id": "title", "properties": {"required":false}}, + {"id": "summary"}, + {"id": "description"}, + {"id": "lang", "properties": {"url":"l"}}, + + {"id": "activities", "properties": {"url":"act"}}, + {"id": "author"}, + {"id": "camera_name"}, + {"id": "date_time"}, + {"id": "elevation", "properties": {"url":"ialt"}}, + {"id": "height"}, + {"id": "image_categories", "properties": {"url":"cat"}}, + {"id": "image_type", "properties": {"url":"ityp"}}, + {"id": "iso_speed"}, + {"id": "file_size"}, + {"id": "filename"}, + {"id": "exposure_time"}, + {"id": "focal_length"}, + {"id": "fnumber"}, + {"id": "quality", "properties": {"url":"qa"}}, + {"id": "width"}, + + {"id": "areas", "properties":{"associationEditorOrder": 6}}, + {"id": "articles", "properties": {"url":"c", "associationEditorOrder": 5}}, + {"id": "books", "properties": {"url":"b", "associationEditorOrder": 7}}, + {"id": "outings", "properties":{"associationEditorOrder": 3}}, + {"id": "routes", "properties": {"url":"r", "associationEditorOrder": 1}}, + {"id": "users", "properties":{"associationEditorOrder": 8}}, + {"id": "waypoints", "properties": {"url":"w", "associationEditorOrder": 2}}, + {"id": "xreports", "properties":{"associationEditorOrder": 4}}, + {"id": "images", "properties":{"associationEditorOrder": 9}} + ] + }, + + "map":{ + "letter":"m", + "fields":[ + {"id": "title"}, + {"id": "summary"}, + {"id": "description"}, + {"id": "lang", "properties": {"url":"l"}}, + + {"id": "code"}, + {"id": "scale"}, + {"id": "editor"} + ] + }, + + "outing":{ + "letter":"o", + "geoLocalized":true, + "fields":[ + {"id": "title"}, + {"id": "summary"}, + {"id": "description"}, + {"id": "conditions_levels", "properties": {"activities": ["skitouring", "snowshoeing", "ice_climbing", "snow_ice_mixed"]}}, + {"id": "participants"}, + {"id": "access_comment"}, + {"id": "weather"}, + {"id": "timing"}, + {"id": "conditions"}, + {"id": "hut_comment"}, + {"id": "route_description"}, + {"id": "avalanches", "properties": {"activities":["ice_climbing", "skitouring", "snowshoeing", "snow_ice_mixed"]}}, + {"id": "lang", "properties": {"url":"l"}}, + + {"id": "access_condition"}, + {"id": "activities", "properties": {"url":"act", "required":true}}, + {"id": "avalanche_signs", "properties": {"url":"avdate", "activities":["ice_climbing", "skitouring", "snowshoeing", "snow_ice_mixed"]}}, + {"id": "condition_rating", "properties": {"url":"ocond"}}, + {"id": "date_end"}, + {"id": "date_start"}, + {"id": "disable_comments"}, + {"id": "elevation_access", "properties": {"url":"oparka"}}, + {"id": "elevation_down_snow", "properties": {"url":"swld", "activities":["ice_climbing", "mountain_climbing", "skitouring", "snow_ice_mixed", "snowshoeing"]}}, + {"id": "elevation_max", "properties": {"url":"oalt"}}, + {"id": "elevation_min"}, + {"id": "elevation_up_snow", "properties": {"url":"swlu", "activities":["ice_climbing", "mountain_climbing", "skitouring", "snow_ice_mixed", "snowshoeing"]}}, + {"id": "engagement_rating", "properties": {"url":"erat", "activities":["mountain_climbing", "snow_ice_mixed"]}}, + {"id": "equipment_rating", "properties": {"url":"prat", "activities":["rock_climbing"]}}, + {"id": "frequentation", "properties": {"url":"ofreq"}}, + {"id": "glacier_rating", "properties": {"url":"oglac", "activities":["mountain_climbing", "skitouring", "snow_ice_mixed", "snowshoeing"]}}, + {"id": "global_rating", "properties": {"url":"grat", "activities":["mountain_climbing", "rock_climbing", "snow_ice_mixed"]}}, + {"id": "height_diff_difficulties", "properties": {"url":"dhei", "activities":["mountain_climbing", "snow_ice_mixed"]}}, + {"id": "height_diff_down"}, + {"id": "height_diff_up", "properties": {"url":"odif"}}, + {"id": "hiking_rating", "properties": {"url":"hrat", "activities":["hiking"]}}, + {"id": "hut_status"}, + {"id": "ice_rating", "properties": {"url":"irat", "activities":["ice_climbing"]}}, + {"id": "labande_global_rating", "properties": {"url":"lrat", "activities":["skitouring"]}}, + {"id": "length_total", "properties": {"url":"olen"}}, + {"id": "lift_status"}, + {"id": "mtb_down_rating", "properties": {"url":"mbdr", "activities":["mountain_biking"]}}, + {"id": "mtb_up_rating", "properties": {"url":"mbur", "activities":["mountain_biking"]}}, + {"id": "partial_trip"}, + {"id": "participant_count"}, + {"id": "public_transport", "properties": {"url":"owpt"}}, + {"id": "quality", "properties": {"url":"qa"}}, + {"id": "rock_free_rating", "properties": {"url":"frat", "activities":["rock_climbing"]}}, + {"id": "ski_rating", "properties": {"url":"trat", "activities":["skitouring"]}}, + {"id": "snow_quality", "properties": {"url":"swqual", "activities":["ice_climbing", "mountain_climbing", "skitouring", "snow_ice_mixed", "snowshoeing"]}}, + {"id": "snow_quantity", "properties": {"url":"swquan", "activities":["ice_climbing", "mountain_climbing", "skitouring", "snow_ice_mixed", "snowshoeing"]}}, + {"id": "snowshoe_rating", "properties": {"url":"wrat", "activities":["snowshoeing"]}}, + {"id": "via_ferrata_rating", "properties": {"url":"krat", "activities":["via_ferrata"]}}, + + {"id": "articles", "properties": {"url":"c", "associationEditorOrder": 5}}, + {"id": "images", "properties": {"associationEditorOrder": 3}}, + {"id": "routes", "properties": {"url":"r", "required":true, "associationEditorOrder": 1}}, + {"id": "users", "properties": {"url":"u", "required":true, "associationEditorOrder": 2}}, + {"id": "xreports", "properties": {"url":"x", "associationEditorOrder": 4}} + ] + }, + + "profile":{ + "letter":"u", + "geoLocalized":true, + "fields":[ + {"id": "summary"}, + {"id": "description"}, + {"id": "lang"}, + + {"id": "activities", "properties": {"url":null, "required":false}}, + {"id": "categories", "properties": {"url":null}}, + {"id": "name"}, + + {"id": "images"} + ] + }, + + "route":{ + "letter":"r", + "geoLocalized":true, + "fields":[ + {"id": "title"}, + {"id": "summary"}, + {"id": "route_history"}, + {"id": "description"}, + {"id": "slackline_anchor1", "properties": {"activities":["slacklining"]}}, + {"id": "slackline_anchor2", "properties": {"activities":["slacklining"]}}, + {"id": "slope", "properties": {"activities":["snow_ice_mixed", "ice_climbing", "snowshoeing", "skitouring"]}}, + {"id": "remarks"}, + {"id": "gear"}, + {"id": "external_resources"}, + {"id": "lang", "properties": {"url":"l"}}, + + {"id": "activities", "properties": {"url":"act"}}, + {"id": "aid_rating", "properties": {"url":"arat", "activities":["rock_climbing", "mountain_climbing"]}}, + {"id": "climbing_outdoor_type", "properties": {"url":"crtyp", "activities":["rock_climbing"]}}, + {"id": "configuration", "properties": {"url":"conf", "activities":["rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_climbing", "snowshoeing", "skitouring"]}}, + {"id": "difficulties_height", "properties": {"url":"ralt", "activities":["rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_climbing", "ice_climbing"]}}, + {"id": "durations", "properties": {"url":"time", "activities":["hiking", "rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_biking", "mountain_climbing", "ice_climbing", "snowshoeing", "skitouring"]}}, + {"id": "elevation_max", "properties": {"url":"rmaxa", "activities":["hiking", "rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_biking", "mountain_climbing", "ice_climbing", "snowshoeing", "skitouring"]}}, + {"id": "elevation_min", "properties": {"url":"rmina", "activities":["hiking", "rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_biking", "mountain_climbing", "ice_climbing", "snowshoeing", "skitouring"]}}, + {"id": "engagement_rating", "properties": {"url":"erat", "activities":["rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_climbing", "ice_climbing"]}}, + {"id": "equipment_rating", "properties": {"url":"prat", "activities":["rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_climbing", "ice_climbing"]}}, + {"id": "exposition_rock_rating", "properties": {"url":"rexpo", "activities":["rock_climbing", "mountain_climbing"]}}, + {"id": "glacier_gear", "properties": {"url":"glac", "activities":["hiking", "rock_climbing", "snow_ice_mixed", "mountain_climbing", "ice_climbing", "snowshoeing", "skitouring"]}}, + {"id": "global_rating", "properties": {"url":"grat", "activities":["rock_climbing", "snow_ice_mixed", "mountain_climbing", "ice_climbing"]}}, + {"id": "height_diff_access", "properties": {"url":"rappr", "activities":["hiking", "rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_biking", "mountain_climbing", "ice_climbing", "snowshoeing", "skitouring"]}}, + {"id": "height_diff_difficulties", "properties": {"url":"dhei", "activities":["hiking", "rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_biking", "mountain_climbing", "ice_climbing", "snowshoeing", "skitouring"]}}, + {"id": "height_diff_down", "properties": {"url":"ddif", "activities":["hiking", "rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_biking", "mountain_climbing", "ice_climbing", "snowshoeing", "skitouring"]}}, + {"id": "height_diff_up", "properties": {"url":"hdif", "activities":["hiking", "rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_biking", "mountain_climbing", "ice_climbing", "snowshoeing", "skitouring"]}}, + {"id": "hiking_mtb_exposition", "properties": {"url":"hexpo", "activities":["hiking", "mountain_biking"]}}, + {"id": "hiking_rating", "properties": {"url":"hrat", "activities":["hiking"]}}, + {"id": "ice_rating", "properties": {"url":"irat", "activities":["snow_ice_mixed", "ice_climbing"]}}, + {"id": "labande_global_rating", "properties": {"url":"lrat", "activities":["skitouring"]}}, + {"id": "labande_ski_rating", "properties": {"url":"srat", "activities":["skitouring"]}}, + {"id": "lift_access"}, + {"id": "main_waypoint_id"}, + {"id": "mixed_rating", "properties": {"url":"mrat", "activities":["snow_ice_mixed", "ice_climbing"]}}, + {"id": "mtb_down_rating", "properties": {"url":"mbdr", "activities":["mountain_biking"]}}, + {"id": "mtb_height_diff_portages", "properties": {"url":"mbpush", "activities":["mountain_biking"]}}, + {"id": "mtb_length_asphalt", "properties": {"url":"mbroad", "activities":["mountain_biking"]}}, + {"id": "mtb_length_trail", "properties": {"url":"mbtrack", "activities":["mountain_biking"]}}, + {"id": "mtb_up_rating", "properties": {"url":"mbur", "activities":["mountain_biking"]}}, + {"id": "orientations", "properties": {"url":"fac"}}, + {"id": "quality", "properties": {"url":"qa"}}, + {"id": "risk_rating", "properties": {"url":"orrat", "activities":["rock_climbing", "snow_ice_mixed", "mountain_climbing", "ice_climbing"]}}, + {"id": "rock_free_rating", "properties": {"url":"frat", "activities":["rock_climbing", "mountain_climbing"]}}, + {"id": "rock_required_rating", "properties": {"url":"rrat", "activities":["rock_climbing", "mountain_climbing"]}}, + {"id": "rock_types", "properties": {"url":"rock", "activities":["rock_climbing", "via_ferrata", "snow_ice_mixed", "mountain_climbing"]}}, + {"id": "route_length", "properties": {"url":"rlen", "activities":["hiking", "slacklining", "via_ferrata", "snow_ice_mixed", "mountain_biking", "snowshoeing", "skitouring"]}}, + {"id": "route_types", "properties": {"url":"rtyp"}}, + {"id": "ski_exposition", "properties": {"url":"sexpo", "activities":["skitouring"]}}, + {"id": "ski_rating", "properties": {"url":"trat", "activities":["skitouring"]}}, + {"id": "slackline_height", "properties": {"activities":["slacklining"]}}, + {"id": "slackline_type", "properties": {"url":"sltyp", "activities":["slacklining"]}}, + {"id": "snowshoe_rating", "properties": {"url":"wrat", "activities":["snowshoeing"]}}, + {"id": "via_ferrata_rating", "properties": {"url":"krat", "activities":["via_ferrata"]}}, + + {"id": "articles", "properties": {"url":"c", "associationEditorOrder": 4}}, + {"id": "books", "properties": {"url":"b", "associationEditorOrder": 2}}, + {"id": "images", "properties": {"associationEditorOrder": 5}}, + {"id": "routes", "properties": {"url":"r", "associationEditorOrder": 3}}, + {"id": "waypoints", "properties": {"url":"w", "associationEditorOrder": 1}}, + {"id": "xreports", "properties": {"url":"x", "associationEditorOrder": 6}} + ] + }, + + "waypoint":{ + "letter":"w", + "geoLocalized":true, + "fields":[ + {"id": "title"}, + {"id": "summary"}, + {"id": "description"}, + {"id": "access", "properties": {"waypoint_types":["access", "climbing_indoor", "climbing_outdoor", "hut", "local_product", "slackline_spot"]}}, + {"id": "access_period", "properties": {"waypoint_types":["access", "camp_site", "climbing_outdoor", "gite", "hut", "local_product"]}}, + {"id": "lang", "properties": {"url":"l"}}, + + {"id": "access_time", "properties": {"url":"tappt", "waypoint_types":["climbing_outdoor", "slackline_spot"]}}, + {"id": "best_periods", "properties": {"url":"period", "waypoint_types":["climbing_outdoor", "slackline_spot"]}}, + {"id": "blanket_unstaffed", "properties": {"waypoint_types":["hut", "shelter"]}}, + {"id": "capacity", "properties": {"url":"hucap", "waypoint_types":["bivouac", "camp_site", "gite", "hut", "shelter"]}}, + {"id": "capacity_staffed", "properties": {"url":"hscap", "waypoint_types":["camp_site", "gite", "hut"]}}, + {"id": "children_proof", "properties": {"url":"chil", "waypoint_types":["climbing_outdoor"]}}, + {"id": "climbing_indoor_types", "properties": {"url":"ctin", "waypoint_types":["climbing_indoor"]}}, + {"id": "climbing_outdoor_types", "properties": {"url":"ctout", "waypoint_types":["climbing_outdoor"]}}, + {"id": "climbing_rating_max", "properties": {"url":"tmaxr", "waypoint_types":["climbing_indoor", "climbing_outdoor"]}}, + {"id": "climbing_rating_median", "properties": {"url":"tmedr", "waypoint_types":["climbing_indoor", "climbing_outdoor"]}}, + {"id": "climbing_rating_min", "properties": {"url":"tminr", "waypoint_types":["climbing_indoor", "climbing_outdoor"]}}, + {"id": "climbing_styles", "properties": {"url":"tcsty", "waypoint_types":["climbing_indoor", "climbing_outdoor"]}}, + {"id": "custodianship", "properties": {"url":"hsta", "waypoint_types":["camp_site", "gite", "hut"]}}, + {"id": "elevation", "properties": {"url":"walt"}}, + {"id": "elevation_min", "properties": {"waypoint_types":["access"]}}, + {"id": "equipment_ratings", "properties": {"url":"anchq", "waypoint_types":["climbing_outdoor"]}}, + {"id": "gas_unstaffed", "properties": {"waypoint_types":["hut", "shelter"]}}, + {"id": "ground_types", "properties": {"waypoint_types":["paragliding_landing", "paragliding_takeoff"]}}, + {"id": "heating_unstaffed", "properties": {"waypoint_types":["hut", "shelter"]}}, + {"id": "height_max", "properties": {"url":"tmaxh", "waypoint_types":["climbing_indoor", "climbing_outdoor"]}}, + {"id": "height_median", "properties": {"url":"tmedh", "waypoint_types":["climbing_indoor", "climbing_outdoor"]}}, + {"id": "height_min", "properties": {"url":"tminh", "waypoint_types":["climbing_indoor", "climbing_outdoor"]}}, + {"id": "length", "properties": {"url":"len", "waypoint_types":["paragliding_landing", "paragliding_takeoff"]}}, + {"id": "lift_access", "properties": {"url":"plift", "waypoint_types":["access"]}}, + {"id": "maps_info"}, + {"id": "matress_unstaffed", "properties": {"waypoint_types":["hut", "shelter"]}}, + {"id": "orientations", "properties": {"url":"wfac", "waypoint_types":["climbing_outdoor", "paragliding_landing", "paragliding_takeoff", "slackline_spot"]}}, + {"id": "paragliding_rating", "properties": {"url":"pgrat", "waypoint_types":["paragliding_landing", "paragliding_takeoff"]}}, + {"id": "parking_fee", "properties": {"waypoint_types":["access"]}}, + {"id": "phone", "properties": {"waypoint_types":["camp_site", "climbing_indoor", "gite", "hut", "local_product"]}}, + {"id": "phone_custodian", "properties": {"waypoint_types":["camp_site", "gite", "hut"]}}, + {"id": "product_types", "properties": {"url":"ftyp", "waypoint_types":["local_product"]}}, + {"id": "prominence", "properties": {"url":"prom", "waypoint_types":["summit"]}}, + {"id": "public_transportation_rating", "properties": {"url":"tp", "waypoint_types":["access"]}}, + {"id": "public_transportation_types", "properties": {"url":"tpty", "waypoint_types":["access"]}}, + {"id": "quality", "properties": {"url":"qa"}}, + {"id": "rain_proof", "properties": {"url":"rain", "waypoint_types":["climbing_outdoor"]}}, + {"id": "rock_types", "properties": {"url":"wrock", "waypoint_types":["climbing_outdoor"]}}, + {"id": "routes_quantity", "properties": {"url":"rqua", "waypoint_types":["climbing_indoor", "climbing_outdoor"]}}, + {"id": "slackline_length_max", "properties": {"waypoint_types":["slackline_spot"]}}, + {"id": "slackline_length_min", "properties": {"waypoint_types":["slackline_spot"]}}, + {"id": "slackline_types", "properties": {"waypoint_types":["slackline_spot"]}}, + {"id": "waypoint_slope", "properties": {"waypoint_types":["paragliding_landing", "paragliding_takeoff"]}}, + {"id": "snow_clearance_rating", "properties": {"url":"psnow", "waypoint_types":["access"]}}, + {"id": "url", "properties": {"waypoint_types":["camp_site", "climbing_indoor", "climbing_outdoor", "gite", "hut", "local_product", "weather_station", "webcam"]}}, + {"id": "waypoint_type", "properties": {"url":"wtyp"}}, + {"id": "weather_station_types", "properties": {"waypoint_types": ["weather_station"], "url":"whtyp"}}, + + {"id": "articles", "properties": {"url":"c", "associationEditorOrder": 3}}, + {"id": "books", "properties": {"url":"b", "associationEditorOrder": 2}}, + {"id": "images", "properties": {"associationEditorOrder": 4}}, + {"id": "waypoints", "properties": {"url":"w", "associationEditorOrder": 1}}, + {"id": "waypoints", "properties": {"name": "waypoint_children", "url":"w", "associationEditorOrder": 1}} + ] + }, + + "xreport":{ + "letter":"x", + "geoLocalized":true, + "fields":[ + {"id": "title"}, + {"id": "summary"}, + {"id": "description"}, + {"id": "place"}, + {"id": "route_study"}, + {"id": "conditions"}, + {"id": "training"}, + {"id": "motivations"}, + {"id": "group_management"}, + {"id": "risk"}, + {"id": "time_management"}, + {"id": "safety"}, + {"id": "reduce_impact"}, + {"id": "increase_impact"}, + {"id": "modifications"}, + {"id": "other_comments"}, + {"id": "lang", "properties": {"url":"l"}}, + + {"id": "elevation", "properties": {"url":"xalt"}}, + {"id": "date"}, + {"id": "event_type", "properties": {"url":"xtyp"}}, + {"id": "event_activity", "properties": {"url":"act"}}, + {"id": "nb_participants", "properties": {"url":"xpar"}}, + {"id": "nb_impacted", "properties": {"url":"ximp"}}, + {"id": "rescue"}, + {"id": "avalanche_level"}, + {"id": "avalanche_slope"}, + {"id": "severity", "properties": {"url":"xsev"}}, + {"id": "author_status"}, + {"id": "activity_rate"}, + {"id": "age"}, + {"id": "gender"}, + {"id": "previous_injuries"}, + {"id": "autonomy"}, + {"id": "qualification"}, + {"id": "supervision"}, + {"id": "disable_comments"}, + {"id": "anonymous"}, + {"id": "quality", "properties": {"url":"qa"}}, + + {"id": "articles", "properties": {"url":"c", "helper": null, "associationEditorOrder": 6}}, + {"id": "images", "properties": {"associationEditorOrder":5}}, + {"id": "outings", "properties": {"url":"o", "helper": null, "associationEditorOrder": 1}}, + {"id": "routes", "properties": {"url":"r", "helper": null, "associationEditorOrder": 3}}, + {"id": "users", "properties": {"associationEditorOrder":2}}, + {"id": "waypoints", "properties": {"associationEditorOrder":4}} + ] + } +} diff --git a/src/test/resources/outings/bavon-in.json b/src/test/resources/outings/bavon-in.json new file mode 100644 index 0000000..2c37edb --- /dev/null +++ b/src/test/resources/outings/bavon-in.json @@ -0,0 +1,727 @@ +{ + "disable_comments": null, + "document_id": 547170, + "areas": [ + { + "type": "a", + "available_langs": null, + "document_id": 14067, + "version": 10, + "locales": [ + { + "version": 1, + "title": "Suisse", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 14384, + "version": 9, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 14437, + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + } + ], + "area_type": "range", + "protected": false + } + ], + "version": 2, + "frequentation": "quiet", + "geometry": { + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}", + "geom_detail": null + }, + "associations": { + "articles": [], + "xreports": [], + "users": [ + { + "forum_username": "Yayo", + "document_id": 737, + "name": "Yayo", + "areas": [ + { + "document_id": 14274, + "available_langs": null, + "type": "a", + "version": 11, + "locales": [ + { + "version": 5, + "title": "France", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + }, + { + "document_id": 14335, + "available_langs": null, + "type": "a", + "version": 3, + "locales": [ + { + "version": 3, + "title": "Haute-Garonne", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + } + ], + "activities": [ + "mountain_climbing", + "snow_ice_mixed", + "hiking", + "paragliding", + "snowshoeing", + "skitouring", + "rock_climbing", + "ice_climbing" + ], + "available_langs": [ + "fr" + ], + "type": "u", + "version": 3, + "locales": [ + { + "version": 77, + "lang": "fr" + } + ], + "protected": false, + "categories": [ + "amateur" + ] + }, + { + "forum_username": "etoile", + "document_id": 106794, + "name": "etoile", + "areas": [], + "activities": [ + "skitouring", + "snow_ice_mixed", + "mountain_climbing", + "hiking", + "snowshoeing", + "rock_climbing", + "ice_climbing" + ], + "available_langs": [ + "fr" + ], + "type": "u", + "version": 2, + "locales": [ + { + "version": 1, + "lang": "fr" + } + ], + "protected": false, + "categories": [ + "amateur" + ] + } + ], + "routes": [ + { + "orientations": [ + "SE" + ], + "document_id": 57103, + "equipment_rating": "P1", + "version": 4, + "activities": [ + "rock_climbing" + ], + "geometry": { + "has_geom_detail": false, + "version": 11, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "available_langs": [ + "es", + "en", + "fr" + ], + "aid_rating": null, + "risk_rating": null, + "areas": [ + { + "document_id": 14067, + "available_langs": null, + "type": "a", + "version": 10, + "locales": [ + { + "version": 1, + "title": "Suisse", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + }, + { + "document_id": 14384, + "available_langs": null, + "type": "a", + "version": 9, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + }, + { + "document_id": 14437, + "available_langs": null, + "type": "a", + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + } + ], + "area_type": "range", + "protected": false + } + ], + "exposition_rock_rating": null, + "height_diff_down": null, + "elevation_min": null, + "height_diff_difficulties": 400, + "engagement_rating": null, + "locales": [ + { + "lang": "fr", + "version": 22, + "title_prefix": "Tour de Bavon", + "title": "Thor", + "summary": "Belle et longue voie \u00e9quip\u00e9e sur des dalles compactes qui sort sous le sommet. " + } + ], + "protected": false, + "rock_required_rating": "5c", + "rock_free_rating": "6a", + "type": "r", + "elevation_max": 2476, + "height_diff_up": null, + "global_rating": "TD-", + "quality": "medium" + } + ], + "images": [ + { + "document_id": 547972, + "type": "i", + "areas": [], + "filename": "1407166923_293646121.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Le pont sur l'A (1750m) \u00e0 partir duquel il faut rester en rive gauche.", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "type": "i", + "areas": [], + "author": null, + "filename": "1407166942_1005392824.jpg", + "available_langs": [ + "fr" + ], + "document_id": 547973, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Qd vs passez au pied de cette dalle attirante, ne cherchez pas, THOR n'est PAS L\u00e0...", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 547974, + "type": "i", + "areas": [], + "filename": "1407166959_1186093463.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR : d\u00e9part de la voie dans la dalle blanche, imm\u00e9diatement \u00e0 droite de la rampe d'herbe oblique", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "type": "i", + "areas": [], + "author": null, + "filename": "1407526184_1731628825.jpg", + "available_langs": [ + "fr" + ], + "document_id": 548914, + "version": 1, + "locales": [ + { + "version": 1, + "title": "La dalle d'attaque, blanche, tout \u00e2 gauche", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548915, + "type": "i", + "areas": [], + "filename": "1407526245_461968093.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR: L1, grande dalle, des \u00e9cailles pos\u00e9es sur le r\u00e9glettes, R1 \u00e0 D", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548916, + "type": "i", + "areas": [], + "filename": "1407526253_1591812939.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR: L4 sur le vague \u00e9peron au centre, \u00e0 droite de la cavit\u00e9", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548937, + "type": "i", + "areas": [], + "filename": "1407526536_793924939.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR : L5", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "type": "i", + "areas": [], + "author": null, + "filename": "1407526546_1198758627.jpg", + "available_langs": [ + "fr" + ], + "document_id": 548938, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR: vue plongeante depuis R4", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548939, + "type": "i", + "areas": [], + "filename": "1407526557_1468063167.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR : L6", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548940, + "type": "i", + "areas": [], + "filename": "1407526566_1671042872.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR : L7", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548941, + "type": "i", + "areas": [], + "filename": "1407526578_453362453.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR: L8, sur de grandes dalles, vers la grande fissure", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548942, + "type": "i", + "areas": [], + "filename": "1407526591_223027668.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR : Tr\u00e8s belle L9, sur un caillou correct!", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548943, + "type": "i", + "areas": [], + "filename": "1407526601_981616281.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR: fin de L9 avec un petit di\u00e8dre raide", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "type": "i", + "areas": [], + "author": null, + "filename": "1407526615_1928563952.jpg", + "available_langs": [ + "fr" + ], + "document_id": 548944, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR : L10", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548945, + "type": "i", + "areas": [], + "filename": "1407526622_1455324122.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR: \u00c9toile sortie ! (R10)", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "type": "i", + "areas": [], + "author": null, + "filename": "1407526644_995429802.jpg", + "available_langs": [ + "fr" + ], + "document_id": 548946, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Edelweiss", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548947, + "type": "i", + "areas": [], + "filename": "1407526652_629783242.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Duo d'Edelweiss", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "document_id": 548948, + "type": "i", + "areas": [], + "filename": "1407526661_962365898.jpg", + "available_langs": [ + "fr" + ], + "author": null, + "version": 1, + "locales": [ + { + "version": 1, + "title": "THOR: pentes de descente, tirer vers les arbres", + "lang": "fr" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + } + ] + }, + "access_condition": null, + "partial_trip": null, + "available_langs": [ + "fr" + ], + "height_diff_down": null, + "equipment_rating": "P1", + "elevation_min": null, + "public_transport": null, + "participant_count": null, + "elevation_access": null, + "elevation_max": 2476, + "date_start": "2014-07-31", + "locales": [ + { + "weather": "Bouch\u00e9 le matin, nuages 50m au dessus de la base des dalles puis \u00e9claircies. ", + "conditions_levels": null, + "route_description": null, + "summary": null, + "version": 4, + "access_comment": null, + "timing": "Approche : 2h30 avec la recherche au pied de la mauvaise dalle. \r\nVoie : 6h", + "participants": null, + "title": "Tour de Bavon\u00a0: Thor", + "lang": "fr", + "hut_comment": null, + "topic_id": null, + "description": "Jolie voie mais le caillou demande de l'attention. Selon \u00c9toile : \"\u00e7a manque de colle entre les dalles de schistes!!\"\r\n\r\nPour l'approche, on est mont\u00e9 trop t\u00f4t \u00e0 droite (300m trop au N), vers les premi\u00e8res grandes dalles au-dessus du chemin, faute de visibilit\u00e9. On a cherch\u00e9 les spits une bonne heure en longeant la paroi. On est redescendu puis on a poursuivi le long du ruisseau jusqu'au pied de la bonne rampe. Indication : poursuivre dans le fond du vallon jusqu'\u00e0 passer un replat avec 3 \u00e9normes blocs. Poursuivre 100m puis obliquer a droite vers une dalle blanche surmont\u00e9e d'un grand toit sombre. (Mise a jour topo a venir)\r\n\r\n[TROUV\u00c9](http://m.camptocamp.org/forums/viewforum.php?id=78) : un brin de rappel au pied de la paroi 300m au N de la voie. ", + "conditions": "## Rocher\r\nSec dans l'ensemble sauf L2, tremp\u00e9e sous le 2\u00e8me point. \r\nPas mal de sections au rocher moyen, dont le ressaut final de L2 et du d\u00e9but de L5, bien p\u00e9teux. Bcp de vigilance n\u00e9cessaire tout le long pour ne pas partir avec une \u00e9caille. \r\nBcp de cailloux pos\u00e9s \u00e9galement et qui n'attendent que le passage de la corde pour se d\u00e9loger. \r\n\r\n## Equipement\r\n\u00c9quip\u00e9 a\u00e9r\u00e9 mais bien \u00e9quip\u00e9.\r\n\r\n\r\n" + } + ], + "protected": false, + "rock_free_rating": "6a", + "date_end": "2014-07-31", + "type": "o", + "condition_rating": "good", + "activities": [ + "rock_climbing" + ], + "hut_status": null, + "height_diff_up": null, + "global_rating": "TD-", + "length_total": null, + "quality": "medium", + "cooked": { + "weather": "

Bouch\u00e9 le matin, nuages 50m au dessus de la base des dalles puis \u00e9claircies.

", + "conditions_levels": null, + "route_description": null, + "summary": null, + "version": 4, + "access_comment": null, + "timing": "

Approche : 2h30 avec la recherche au pied de la mauvaise dalle.
\nVoie : 6h

", + "participants": null, + "title": "Tour de Bavon\u00a0: Thor", + "lang": "fr", + "hut_comment": null, + "topic_id": null, + "description": "

Jolie voie mais le caillou demande de l'attention. Selon \u00c9toile : \"\u00e7a manque de colle entre les dalles de schistes!!\"

\n

Pour l'approche, on est mont\u00e9 trop t\u00f4t \u00e0 droite (300m trop au N), vers les premi\u00e8res grandes dalles au-dessus du chemin, faute de visibilit\u00e9. On a cherch\u00e9 les spits une bonne heure en longeant la paroi. On est redescendu puis on a poursuivi le long du ruisseau jusqu'au pied de la bonne rampe. Indication : poursuivre dans le fond du vallon jusqu'\u00e0 passer un replat avec 3 \u00e9normes blocs. Poursuivre 100m puis obliquer a droite vers une dalle blanche surmont\u00e9e d'un grand toit sombre. (Mise a jour topo a venir)

\n

TROUV\u00c9 : un brin de rappel au pied de la paroi 300m au N de la voie.

", + "conditions": "

Rocher

\n

Sec dans l'ensemble sauf L2, tremp\u00e9e sous le 2\u00e8me point.
\nPas mal de sections au rocher moyen, dont le ressaut final de L2 et du d\u00e9but de L5, bien p\u00e9teux. Bcp de vigilance n\u00e9cessaire tout le long pour ne pas partir avec une \u00e9caille.
\nBcp de cailloux pos\u00e9s \u00e9galement et qui n'attendent que le passage de la corde pour se d\u00e9loger.

\n

Equipement

\n

\u00c9quip\u00e9 a\u00e9r\u00e9 mais bien \u00e9quip\u00e9.

" + }, + "lift_status": null +} diff --git a/src/test/resources/routes/57103-in.json b/src/test/resources/routes/57103-in.json new file mode 100644 index 0000000..8b7197f --- /dev/null +++ b/src/test/resources/routes/57103-in.json @@ -0,0 +1,1206 @@ +{ + "glacier_gear": "no", + "orientations": [ + "SE" + ], + "document_id": 57103, + "equipment_rating": "P1", + "lift_access": null, + "height_diff_access": null, + "version": 4, + "activities": [ + "rock_climbing" + ], + "geometry": { + "version": 11, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}", + "geom_detail": null + }, + "associations": { + "articles": [ + { + "article_type": "collab", + "document_id": 302772, + "activities": [ + "mountain_climbing", + "rock_climbing" + ], + "available_langs": [ + "en" + ], + "type": "c", + "version": 1, + "locales": [ + { + "version": 15, + "lang": "en", + "title": "Over eighty fun fives in the Mont Blanc Region", + "summary": null + } + ], + "quality": "medium", + "protected": false, + "categories": [ + "topoguide_supplements" + ] + } + ], + "routes": [], + "images": [ + { + "author": null, + "type": "i", + "areas": [], + "filename": "1310977682_7995170.jpg", + "available_langs": [ + "fr" + ], + "document_id": 287631, + "version": 1, + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Approche de la voie" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + }, + { + "author": null, + "type": "i", + "areas": [], + "filename": "1310977687_160296752.jpg", + "available_langs": [ + "fr" + ], + "document_id": 287632, + "version": 1, + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Début de la voie" + } + ], + "geometry": { + "version": 1, + "geom": null + }, + "protected": false + } + ], + "waypoints": [ + { + "waypoint_type": "summit", + "elevation": 2476, + "document_id": 37297, + "areas": [ + { + "document_id": 14067, + "available_langs": null, + "type": "a", + "version": 10, + "locales": [ + { + "version": 1, + "title": "Suisse", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + }, + { + "document_id": 14384, + "available_langs": null, + "type": "a", + "version": 9, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + }, + { + "document_id": 14437, + "available_langs": null, + "type": "a", + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + } + ], + "area_type": "range", + "protected": false + } + ], + "available_langs": [ + "fr" + ], + "quality": "medium", + "type": "w", + "version": 2, + "locales": [ + { + "lang": "fr", + "title": "Tour de Bavon", + "version": 1, + "summary": null + } + ], + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [796139.1870349669, 5775382.358943045], \"type\": \"Point\"}" + }, + "protected": false + }, + { + "waypoint_type": "access", + "elevation": 1423, + "document_id": 142917, + "areas": [ + { + "document_id": 14067, + "available_langs": null, + "type": "a", + "version": 10, + "locales": [ + { + "version": 1, + "title": "Suisse", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + }, + { + "document_id": 14384, + "available_langs": null, + "type": "a", + "version": 9, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + }, + { + "document_id": 14437, + "available_langs": null, + "type": "a", + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + } + ], + "area_type": "range", + "protected": false + } + ], + "available_langs": [ + "fr" + ], + "quality": "medium", + "type": "w", + "version": 2, + "locales": [ + { + "lang": "fr", + "title": "Vichères", + "version": 4, + "summary": null + } + ], + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [797788.4966105582, 5779898.927220736], \"type\": \"Point\"}" + }, + "protected": false + } + ], + "xreports": [], + "recent_outings": { + "total": 9, + "documents": [ + { + "img_count": 0, + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "equipment_rating": "P1", + "elevation_max": 2476, + "date_start": "2015-09-06", + "locales": [ + { + "lang": "fr", + "title": "Tour de Bavon : Thor", + "version": 1, + "summary": null + } + ], + "author": { + "user_id": 253878, + "name": "Mireille Vuadens" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2015-09-06", + "height_diff_up": null, + "condition_rating": "excellent", + "areas": [ + { + "document_id": 14437, + "available_langs": null, + "type": "a", + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + } + ], + "area_type": "range", + "protected": false + }, + { + "document_id": 14384, + "available_langs": null, + "type": "a", + "version": 9, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + }, + { + "document_id": 14067, + "available_langs": null, + "type": "a", + "version": 10, + "locales": [ + { + "version": 1, + "title": "Suisse", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "document_id": 673121, + "global_rating": "TD-", + "quality": "medium", + "version": 2, + "type": "o" + }, + { + "img_count": 18, + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "equipment_rating": "P1", + "elevation_max": 2476, + "date_start": "2014-07-31", + "locales": [ + { + "lang": "fr", + "title": "Tour de Bavon : Thor", + "version": 4, + "summary": null + } + ], + "author": { + "user_id": 737, + "name": "Yayo" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2014-07-31", + "height_diff_up": null, + "condition_rating": "good", + "areas": [ + { + "document_id": 14067, + "available_langs": null, + "type": "a", + "version": 10, + "locales": [ + { + "version": 1, + "title": "Suisse", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + }, + { + "document_id": 14384, + "available_langs": null, + "type": "a", + "version": 9, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + }, + { + "document_id": 14437, + "available_langs": null, + "type": "a", + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + } + ], + "area_type": "range", + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "document_id": 547170, + "global_rating": "TD-", + "quality": "medium", + "version": 2, + "type": "o" + }, + { + "img_count": 0, + "date_start": "2013-08-18", + "document_id": 455000, + "equipment_rating": "P1", + "elevation_max": 2476, + "version": 2, + "locales": [ + { + "version": 1, + "summary": null, + "lang": "fr", + "title": "Tour de Bavon : Thor" + } + ], + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2013-08-18", + "height_diff_up": null, + "condition_rating": "good", + "areas": [ + { + "type": "a", + "area_type": "range", + "available_langs": null, + "document_id": 14437, + "version": 6, + "locales": [ + { + "version": 7, + "lang": "fr", + "title": "Valais W - Alpes Pennines W" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "country", + "available_langs": null, + "document_id": 14067, + "version": 10, + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Suisse" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "admin_limits", + "available_langs": null, + "document_id": 14384, + "version": 9, + "locales": [ + { + "version": 12, + "lang": "fr", + "title": "Valais" + } + ], + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "type": "o", + "author": { + "user_id": 10657, + "name": "Pierre-alain Baehler" + }, + "quality": "medium", + "global_rating": "TD-" + }, + { + "img_count": 0, + "date_start": "2013-08-17", + "document_id": 455861, + "equipment_rating": "P1", + "elevation_max": 2476, + "version": 2, + "locales": [ + { + "version": 1, + "summary": null, + "lang": "fr", + "title": "Tour de Bavon : Thor" + } + ], + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2013-08-17", + "height_diff_up": null, + "condition_rating": null, + "areas": [ + { + "type": "a", + "area_type": "country", + "available_langs": null, + "document_id": 14067, + "version": 10, + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Suisse" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "admin_limits", + "available_langs": null, + "document_id": 14384, + "version": 9, + "locales": [ + { + "version": 12, + "lang": "fr", + "title": "Valais" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "range", + "available_langs": null, + "document_id": 14437, + "version": 6, + "locales": [ + { + "version": 7, + "lang": "fr", + "title": "Valais W - Alpes Pennines W" + } + ], + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "type": "o", + "author": { + "user_id": 453526, + "name": "telemarcoeur" + }, + "quality": "medium", + "global_rating": "TD-" + }, + { + "img_count": 0, + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "equipment_rating": "P1", + "elevation_max": 2476, + "date_start": "2013-08-15", + "locales": [ + { + "lang": "fr", + "title": "Tour de Bavon : Thor", + "version": 1, + "summary": null + } + ], + "author": { + "user_id": 419715, + "name": "mica" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2013-08-15", + "height_diff_up": null, + "condition_rating": "good", + "areas": [ + { + "document_id": 14384, + "available_langs": null, + "type": "a", + "version": 9, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + }, + { + "document_id": 14067, + "available_langs": null, + "type": "a", + "version": 10, + "locales": [ + { + "version": 1, + "title": "Suisse", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + }, + { + "document_id": 14437, + "available_langs": null, + "type": "a", + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + } + ], + "area_type": "range", + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "document_id": 455187, + "global_rating": "TD-", + "quality": "medium", + "version": 2, + "type": "o" + }, + { + "img_count": 4, + "date_start": "2012-09-15", + "document_id": 374951, + "equipment_rating": "P1", + "elevation_max": 2476, + "version": 2, + "locales": [ + { + "version": 1, + "summary": null, + "lang": "fr", + "title": "Tour de Bavon : Thor" + } + ], + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2012-09-15", + "height_diff_up": 400, + "condition_rating": "excellent", + "areas": [ + { + "type": "a", + "area_type": "admin_limits", + "available_langs": null, + "document_id": 14384, + "version": 9, + "locales": [ + { + "version": 12, + "lang": "fr", + "title": "Valais" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "country", + "available_langs": null, + "document_id": 14067, + "version": 10, + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Suisse" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "range", + "available_langs": null, + "document_id": 14437, + "version": 6, + "locales": [ + { + "version": 7, + "lang": "fr", + "title": "Valais W - Alpes Pennines W" + } + ], + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "type": "o", + "author": { + "user_id": 243028, + "name": "fugace" + }, + "quality": "medium", + "global_rating": "TD-" + }, + { + "img_count": 12, + "date_start": "2011-07-16", + "document_id": 287625, + "equipment_rating": "P1", + "elevation_max": 2476, + "version": 2, + "locales": [ + { + "version": 1, + "summary": null, + "lang": "fr", + "title": "Tour de Bavon : Thor" + } + ], + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2011-07-16", + "height_diff_up": null, + "condition_rating": "excellent", + "areas": [ + { + "type": "a", + "area_type": "country", + "available_langs": null, + "document_id": 14067, + "version": 10, + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Suisse" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "admin_limits", + "available_langs": null, + "document_id": 14384, + "version": 9, + "locales": [ + { + "version": 12, + "lang": "fr", + "title": "Valais" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "range", + "available_langs": null, + "document_id": 14437, + "version": 6, + "locales": [ + { + "version": 7, + "lang": "fr", + "title": "Valais W - Alpes Pennines W" + } + ], + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "type": "o", + "author": { + "user_id": 112318, + "name": "Frank Bussink" + }, + "quality": "medium", + "global_rating": "TD-" + }, + { + "img_count": 3, + "date_start": "2008-08-04", + "document_id": 135345, + "equipment_rating": "P1", + "elevation_max": null, + "version": 2, + "locales": [ + { + "version": 2, + "summary": null, + "lang": "fr", + "title": "Tour de Bavon : Thor" + } + ], + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2008-08-04", + "height_diff_up": 600, + "condition_rating": null, + "areas": [ + { + "type": "a", + "area_type": "country", + "available_langs": null, + "document_id": 14067, + "version": 10, + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Suisse" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "admin_limits", + "available_langs": null, + "document_id": 14384, + "version": 9, + "locales": [ + { + "version": 12, + "lang": "fr", + "title": "Valais" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "range", + "available_langs": null, + "document_id": 14437, + "version": 6, + "locales": [ + { + "version": 7, + "lang": "fr", + "title": "Valais W - Alpes Pennines W" + } + ], + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "type": "o", + "author": { + "user_id": 458, + "name": "BertrandSemelet" + }, + "quality": "medium", + "global_rating": "TD-" + }, + { + "img_count": 0, + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "equipment_rating": "P1", + "elevation_max": null, + "date_start": "2006-10-17", + "locales": [ + { + "lang": "fr", + "title": "Tour de Bavon : Thor", + "version": 1, + "summary": null + } + ], + "author": { + "user_id": 3994, + "name": "Stéphane Visentini" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2006-10-17", + "height_diff_up": null, + "condition_rating": null, + "areas": [ + { + "document_id": 14067, + "available_langs": null, + "type": "a", + "version": 10, + "locales": [ + { + "version": 1, + "title": "Suisse", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + }, + { + "document_id": 14384, + "available_langs": null, + "type": "a", + "version": 9, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + }, + { + "document_id": 14437, + "available_langs": null, + "type": "a", + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + } + ], + "area_type": "range", + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "document_id": 93233, + "global_rating": "TD-", + "quality": "medium", + "version": 2, + "type": "o" + } + ] + }, + "books": [ + { + "available_langs": [ + "fr" + ], + "document_id": 14606, + "book_types": [ + "topo" + ], + "activities": [ + "rock_climbing" + ], + "quality": "medium", + "type": "b", + "version": 5, + "locales": [ + { + "version": 11, + "lang": "fr", + "title": "Entremont Escalades" + } + ], + "author": "Olivier Roduit", + "protected": false + } + ] + }, + "available_langs": [ + "es", + "en", + "fr" + ], + "aid_rating": null, + "rock_required_rating": "5c", + "areas": [ + { + "type": "a", + "area_type": "country", + "available_langs": null, + "document_id": 14067, + "version": 10, + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Suisse" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "admin_limits", + "available_langs": null, + "document_id": 14384, + "version": 9, + "locales": [ + { + "version": 12, + "lang": "fr", + "title": "Valais" + } + ], + "protected": false + }, + { + "type": "a", + "area_type": "range", + "available_langs": null, + "document_id": 14437, + "version": 6, + "locales": [ + { + "version": 7, + "lang": "fr", + "title": "Valais W - Alpes Pennines W" + } + ], + "protected": false + } + ], + "exposition_rock_rating": null, + "height_diff_down": null, + "climbing_outdoor_type": "multi", + "rock_types": null, + "elevation_min": null, + "difficulties_height": null, + "elevation_max": 2476, + "engagement_rating": null, + "locales": [ + { + "external_resources": null, + "lang": "fr", + "route_history": "Thomas Hallen et Olivier Roduit. Ouverture du bas en 2002.\n\"THOR\" = ? \"T\"homas \"H\"allen et \"O\"livier \"R\"oduit)", + "title": "Thor", + "summary": "Belle et longue voie équipée sur des dalles compactes qui sort sous le sommet. ", + "version": 22, + "remarks": "\n!!!! En accord avec le service cantonal de la chasse, l’escalade est tolérée uniquement du 15 juin au 15 septembre afin d’éviter toute pression sur les cerfs et les chamois en période de mise bas et de rut.\n\n## Rocher\nMoyen à bon. Beaucoup de cailloux et graille posés sur les terrasses. \n\n## Équipement\nTous les relais sont équipés de 2 points non reliés. Seul R1 est équipé d'un maillon rapide. ", + "topic_id": null, + "gear": "* corde 50 m double\n* 7 dégaines\n* friends ou coinceurs inutiles car le rocher est compact et ne s'y prête pas", + "description": "## Approche ### 1h\nDe l'épingle 1573 m, emprunter la route forestière en direction de la combe de l'A (direction S). Au niveau de l'épingle 1673 m, la piste traverse le torrent de l'A (contrairement à ce que dit le topo d'O. Roduit, il n'y pas/plus de pont car le torrent est canalisé sous la piste). De là, 2 possibilités : \n- 50 m avant l'épingle, prendre une sente à droite qui monte raide sur 20 m puis traverse à gauche et rejoint un bisse (rive gauche du torrent de l'A). Le suivre jusqu'au pont sur l'A à 1750 m. \n- traverser le torrent de l'A au niveau de l'épingle et emprunter à droite le bon chemin qui monte en rive droite de l'A (direction S). Il rejoint une piste peu avant le point coté 1758 m. La suivre sur 100 m (SW) puis descendre jusqu'au pont sur l'A à 1750 m par un bon sentier à droite et le traverser.\n\nDe ce pont, remonter la combe de l'A en rive gauche (sente) jusqu'à un replat avec 3 énormes blocs groupés (Verdeuse sur CN, 1797 m). Continuer environ 100 m dans le fond de la combe et la quitter à droite (cairns) pour remonter jusqu'au pied de la voie.\n\n## Itinéraire\nLe départ de la voie se situe au niveau d'une grande dalle blanche qui forme la partie gauche d'un large dièdre ouvert, couché, s'élevant vers la gauche et surmonté d'un large surplomb noir.\n\nL# | 5a | 50 m | 7pts | Remonter le bord gauche de la grande dalle blanche couchée. Les premiers points (avec anneaux de corde noir) sont peu visibles et situés sur la lèvre rocheuse qui borde la dalle sur sa gauche. À mi-hauteur, traverser la dalle en ascendance vers la droite et rejoindre le relais au centre du large dièdre, au pied d'une zone noire. \nL# | 5c | 25 m | 3pts | Remonter le dièdre en son fond sur 20 m puis gravir directement son flanc droit, quelques mètres avant le grand surplomb (5c, 1 pt, rocher schisteux pourri). Relais immédiatement au-dessus sur une petite terrasse. \nL# | 5b | 45 m | 6pts | Franchir le petit mur au-dessus du relais vers la droite (1 pt non visible du relais), puis gravir une zone facile vers la gauche qui débouche sur une longue dalle couchée et compacte. La remonter en son centre en direction d'une cavité qui la domine. Gagner le relais à droite, sur le flanc d'un vague éperon issu du bord droit de la cavité. \nL# | 5b | 40 m | 6pts | *** Remonter ce vague éperon qui permet de contourner la cavité par la droite, puis dalle couchée. \nL# | 5c | 50 m | 5pts | ** Franchir quelques gradins légèrement vers la droite puis franchir des dalles raides (1 pas de 5c sur des écailles péteuses)\nL# | 5c | 45 m | 6pts | *** Franchir une écaille verticale (5+, Dülfer), puis une dalle à réglettes puis un mur vertical pour se rétablir sur une dalle compacte. Relais juste au-dessus sous un surplomb. \nL# | 6a | 35 m | 6pts | Grimper en ascendance gauche, franchir une courte dalle raide et fine (5+) sous un mur jaune, traverser à gauche puis gravir une courte cheminée verticale et prisue. Relais immédiatement à la sortie. \nL# | 5b| 45 m | 5pts | Gravir une longue dalle couchée (équipement aéré) en direction d'une profonde fissure qui raie la paroi sommitale de gauche à droite. Remonter le bord droit de la fissure. \nL# | 6a | 35 m | 7pts | *** Poursuivre sur le bord droit de la fissure jusqu'à un surplomb que l'on surmonte par un court dièdre à droite (6a athlétique, 2pts). Relais à droite à la sortie. \nL# | 5b | 40 m | 6pts | Tout droit au-dessus du relais sur une vague croupe rocheuse (rocher moyen)\n\n##Descente\nDu sommet, traverser à droite cairn et descendre des pentes herbeuses en direction d'un groupe de mélèzes et tirer à gauche pour rejoindre un couloir (le grand Tseno) que l'on suit jusqu'au chemin de montée.\nRappel dans la voie très vivement déconseillé (chute de pierre certaine en rappelant la corde).", + "title_prefix": "Tour de Bavon" + } + ], + "protected": false, + "risk_rating": null, + "durations": [ + "1" + ], + "rock_free_rating": "6a", + "main_waypoint_id": 37297, + "maps": [ + { + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Val de Bagnes" + } + ], + "type": "m", + "code": "46", + "available_langs": null, + "document_id": 104631, + "version": 1, + "editor": "Swisstopo", + "protected": false + }, + { + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Martigny" + } + ], + "type": "m", + "code": "282", + "available_langs": null, + "document_id": 104639, + "version": 1, + "editor": "Swisstopo", + "protected": false + }, + { + "locales": [ + { + "version": 1, + "lang": "fr", + "title": "Orsières" + } + ], + "type": "m", + "code": "1345", + "available_langs": null, + "document_id": 104831, + "version": 1, + "editor": "Swisstopo", + "protected": false + } + ], + "height_diff_up": null, + "configuration": [ + "face" + ], + "height_diff_difficulties": 400, + "type": "r", + "global_rating": "TD-", + "quality": "medium", + "cooked": { + "external_resources": null, + "remarks": "
\n

En accord avec le service cantonal de la chasse, l’escalade est tolérée uniquement du 15 juin au 15 septembre afin d’éviter toute pression sur les cerfs et les chamois en période de mise bas et de rut.

\n
\n

Rocher

\n

Moyen à bon. Beaucoup de cailloux et graille posés sur les terrasses.

\n

Équipement

\n

Tous les relais sont équipés de 2 points non reliés. Seul R1 est équipé d'un maillon rapide.

", + "lang": "fr", + "title_prefix": "

Tour de Bavon

", + "summary": "

Belle et longue voie équipée sur des dalles compactes qui sort sous le sommet.

", + "version": 22, + "route_history": "

Thomas Hallen et Olivier Roduit. Ouverture du bas en 2002.
\n\"THOR\" = ? \"T\"homas \"H\"allen et \"O\"livier \"R\"oduit)

", + "topic_id": null, + "title": "Thor", + "description": "

Approche 1h

\n

De l'épingle 1573 m, emprunter la route forestière en direction de la combe de l'A (direction S). Au niveau de l'épingle 1673 m, la piste traverse le torrent de l'A (contrairement à ce que dit le topo d'O. Roduit, il n'y pas/plus de pont car le torrent est canalisé sous la piste). De là, 2 possibilités :
\n- 50 m avant l'épingle, prendre une sente à droite qui monte raide sur 20 m puis traverse à gauche et rejoint un bisse (rive gauche du torrent de l'A). Le suivre jusqu'au pont sur l'A à 1750 m.
\n- traverser le torrent de l'A au niveau de l'épingle et emprunter à droite le bon chemin qui monte en rive droite de l'A (direction S). Il rejoint une piste peu avant le point coté 1758 m. La suivre sur 100 m (SW) puis descendre jusqu'au pont sur l'A à 1750 m par un bon sentier à droite et le traverser.

\n

De ce pont, remonter la combe de l'A en rive gauche (sente) jusqu'à un replat avec 3 énormes blocs groupés (Verdeuse sur CN, 1797 m). Continuer environ 100 m dans le fond de la combe et la quitter à droite (cairns) pour remonter jusqu'au pied de la voie.

\n

Itinéraire

\n

Le départ de la voie se situe au niveau d'une grande dalle blanche qui forme la partie gauche d'un large dièdre ouvert, couché, s'élevant vers la gauche et surmonté d'un large surplomb noir.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
L15a50 m7ptsRemonter le bord gauche de la grande dalle blanche couchée. Les premiers points (avec anneaux de corde noir) sont peu visibles et situés sur la lèvre rocheuse qui borde la dalle sur sa gauche. À mi-hauteur, traverser la dalle en ascendance vers la droite et rejoindre le relais au centre du large dièdre, au pied d'une zone noire.
L25c25 m3ptsRemonter le dièdre en son fond sur 20 m puis gravir directement son flanc droit, quelques mètres avant le grand surplomb (5c, 1 pt, rocher schisteux pourri). Relais immédiatement au-dessus sur une petite terrasse.
L35b45 m6ptsFranchir le petit mur au-dessus du relais vers la droite (1 pt non visible du relais), puis gravir une zone facile vers la gauche qui débouche sur une longue dalle couchée et compacte. La remonter en son centre en direction d'une cavité qui la domine. Gagner le relais à droite, sur le flanc d'un vague éperon issu du bord droit de la cavité.
L45b40 m6pts*** Remonter ce vague éperon qui permet de contourner la cavité par la droite, puis dalle couchée.
L55c50 m5pts** Franchir quelques gradins légèrement vers la droite puis franchir des dalles raides (1 pas de 5c sur des écailles péteuses)
L65c45 m6pts*** Franchir une écaille verticale (5+, Dülfer), puis une dalle à réglettes puis un mur vertical pour se rétablir sur une dalle compacte. Relais juste au-dessus sous un surplomb.
L76a35 m6ptsGrimper en ascendance gauche, franchir une courte dalle raide et fine (5+) sous un mur jaune, traverser à gauche puis gravir une courte cheminée verticale et prisue. Relais immédiatement à la sortie.
L85b45 m5ptsGravir une longue dalle couchée (équipement aéré) en direction d'une profonde fissure qui raie la paroi sommitale de gauche à droite. Remonter le bord droit de la fissure.
L96a35 m7pts*** Poursuivre sur le bord droit de la fissure jusqu'à un surplomb que l'on surmonte par un court dièdre à droite (6a athlétique, 2pts). Relais à droite à la sortie.
L105b40 m6ptsTout droit au-dessus du relais sur une vague croupe rocheuse (rocher moyen)
\n

Descente

\n

Du sommet, traverser à droite cairn et descendre des pentes herbeuses en direction d'un groupe de mélèzes et tirer à gauche pour rejoindre un couloir (le grand Tseno) que l'on suit jusqu'au chemin de montée.
\nRappel dans la voie très vivement déconseillé (chute de pierre certaine en rappelant la corde).

", + "gear": "
    \n
  • corde 50 m double
  • \n
  • 7 dégaines
  • \n
  • friends ou coinceurs inutiles car le rocher est compact et ne s'y prête pas
  • \n
" + }, + "route_types": [ + "loop" + ] +} diff --git a/src/test/resources/routes/outing.json b/src/test/resources/routes/outing.json new file mode 100644 index 0000000..0588d01 --- /dev/null +++ b/src/test/resources/routes/outing.json @@ -0,0 +1,86 @@ +{ + "img_count": 0, + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "equipment_rating": "P1", + "elevation_max": 2476, + "date_start": "2015-09-06", + "locales": [ + { + "lang": "fr", + "title": "Tour de Bavon : Thor", + "version": 1, + "summary": null + } + ], + "author": { + "user_id": 253878, + "name": "Mireille Vuadens" + }, + "protected": false, + "rock_free_rating": "6a", + "date_end": "2015-09-06", + "height_diff_up": null, + "condition_rating": "excellent", + "areas": [ + { + "document_id": 14437, + "available_langs": null, + "type": "a", + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + } + ], + "area_type": "range", + "protected": false + }, + { + "document_id": 14384, + "available_langs": null, + "type": "a", + "version": 9, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + } + ], + "area_type": "admin_limits", + "protected": false + }, + { + "document_id": 14067, + "available_langs": null, + "type": "a", + "version": 10, + "locales": [ + { + "version": 1, + "title": "Suisse", + "lang": "fr" + } + ], + "area_type": "country", + "protected": false + } + ], + "activities": [ + "rock_climbing" + ], + "available_langs": [ + "fr" + ], + "document_id": 673121, + "global_rating": "TD-", + "quality": "medium", + "version": 2, + "type": "o" +} diff --git a/src/test/resources/search/bavon b/src/test/resources/search/bavon new file mode 100644 index 0000000..3ccb276 --- /dev/null +++ b/src/test/resources/search/bavon @@ -0,0 +1,2246 @@ +tour de bavon +--- +{ + "routes": { + "total": 25587, + "documents": [ + { + "risk_rating": null, + "type": "r", + "exposition_rock_rating": null, + "geometry": { + "version": 11, + "has_geom_detail": false, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "aid_rating": null, + "global_rating": "TD-", + "version": 4, + "elevation_max": 2476, + "available_langs": [ + "es", + "en", + "fr" + ], + "activities": [ + "rock_climbing" + ], + "quality": "medium", + "height_diff_down": null, + "rock_required_rating": "5c", + "protected": false, + "height_diff_difficulties": 400, + "equipment_rating": "P1", + "height_diff_up": null, + "engagement_rating": null, + "rock_free_rating": "6a", + "locales": [ + { + "summary": "Bonita v\u00eda larga equipada con placas compactas que slaen eln la cumbre.", + "version": 12, + "title": "Thor", + "lang": "es", + "title_prefix": "Tour de Bavon" + }, + { + "summary": null, + "version": 5, + "title": "Thor", + "lang": "en", + "title_prefix": "Tour de Bavon" + }, + { + "summary": "Belle et longue voie \u00e9quip\u00e9e sur des dalles compactes qui sort sous le sommet. ", + "version": 22, + "title": "Thor", + "lang": "fr", + "title_prefix": "Tour de Bavon" + } + ], + "document_id": 57103, + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14067, + "locales": [ + { + "version": 1, + "title": "Su\u00efssa", + "lang": "ca" + }, + { + "version": 2, + "title": "Schweiz", + "lang": "de" + }, + { + "version": 1, + "title": "Switzerland", + "lang": "en" + }, + { + "version": 1, + "title": "Suiza", + "lang": "es" + }, + { + "version": 1, + "title": "Suitza", + "lang": "eu" + }, + { + "version": 1, + "title": "Suisse", + "lang": "fr" + }, + { + "version": 1, + "title": "Svizzera", + "lang": "it" + } + ], + "version": 10, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14384, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + }, + { + "version": 1, + "title": "Valais", + "lang": "ca" + }, + { + "version": 1, + "title": "Wallis", + "lang": "de" + }, + { + "version": 1, + "title": "Valais", + "lang": "en" + }, + { + "version": 1, + "title": "Valais", + "lang": "es" + }, + { + "version": 1, + "title": "Valais", + "lang": "eu" + }, + { + "version": 1, + "title": "Vallese", + "lang": "it" + } + ], + "version": 9, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14437, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "version": 6, + "area_type": "range", + "protected": false + } + ], + "elevation_min": null, + "orientations": [ + "SE" + ] + }, + { + "type": "r", + "height_diff_difficulties": null, + "geometry": { + "version": 4, + "has_geom_detail": false, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "labande_global_rating": "PD+", + "height_diff_up": 850, + "height_diff_down": 850, + "ski_exposition": "E1", + "labande_ski_rating": "S3", + "elevation_max": 2476, + "available_langs": [ + "en", + "fr" + ], + "locales": [ + { + "summary": null, + "version": 4, + "title": "Depuis Vich\u00e8res", + "lang": "en", + "title_prefix": "Tour de Bavon" + }, + { + "summary": null, + "version": 7, + "title": "Depuis Vich\u00e8res", + "lang": "fr", + "title_prefix": "Tour de Bavon" + } + ], + "ski_rating": "2.3", + "activities": [ + "skitouring" + ], + "document_id": 48341, + "quality": "medium", + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14067, + "locales": [ + { + "version": 1, + "title": "Su\u00efssa", + "lang": "ca" + }, + { + "version": 2, + "title": "Schweiz", + "lang": "de" + }, + { + "version": 1, + "title": "Switzerland", + "lang": "en" + }, + { + "version": 1, + "title": "Suiza", + "lang": "es" + }, + { + "version": 1, + "title": "Suitza", + "lang": "eu" + }, + { + "version": 1, + "title": "Suisse", + "lang": "fr" + }, + { + "version": 1, + "title": "Svizzera", + "lang": "it" + } + ], + "version": 10, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14384, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + }, + { + "version": 1, + "title": "Valais", + "lang": "ca" + }, + { + "version": 1, + "title": "Wallis", + "lang": "de" + }, + { + "version": 1, + "title": "Valais", + "lang": "en" + }, + { + "version": 1, + "title": "Valais", + "lang": "es" + }, + { + "version": 1, + "title": "Valais", + "lang": "eu" + }, + { + "version": 1, + "title": "Vallese", + "lang": "it" + } + ], + "version": 9, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14437, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "version": 6, + "area_type": "range", + "protected": false + } + ], + "elevation_min": 1600, + "orientations": [ + "NE" + ], + "version": 4, + "protected": false + }, + { + "hiking_rating": "T3", + "type": "r", + "height_diff_difficulties": 60, + "geometry": { + "version": 3, + "has_geom_detail": false, + "geom": "{\"coordinates\": [796139.1870349669, 5775382.358943045], \"type\": \"Point\"}" + }, + "height_diff_up": 883, + "height_diff_down": null, + "hiking_mtb_exposition": null, + "elevation_max": 2476, + "available_langs": [ + "fr" + ], + "locales": [ + { + "summary": "Cet itin\u00e9raire est le m\u00eame que celui utilis\u00e9 par les randonneurs \u00e0 skis.", + "version": 3, + "title": "Ar\u00eate W", + "lang": "fr", + "title_prefix": "Tour de Bavon" + } + ], + "activities": [ + "hiking" + ], + "document_id": 931643, + "quality": "fine", + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14067, + "locales": [ + { + "version": 1, + "title": "Su\u00efssa", + "lang": "ca" + }, + { + "version": 2, + "title": "Schweiz", + "lang": "de" + }, + { + "version": 1, + "title": "Switzerland", + "lang": "en" + }, + { + "version": 1, + "title": "Suiza", + "lang": "es" + }, + { + "version": 1, + "title": "Suitza", + "lang": "eu" + }, + { + "version": 1, + "title": "Suisse", + "lang": "fr" + }, + { + "version": 1, + "title": "Svizzera", + "lang": "it" + } + ], + "version": 10, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14384, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + }, + { + "version": 1, + "title": "Valais", + "lang": "ca" + }, + { + "version": 1, + "title": "Wallis", + "lang": "de" + }, + { + "version": 1, + "title": "Valais", + "lang": "en" + }, + { + "version": 1, + "title": "Valais", + "lang": "es" + }, + { + "version": 1, + "title": "Valais", + "lang": "eu" + }, + { + "version": 1, + "title": "Vallese", + "lang": "it" + } + ], + "version": 9, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14437, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "version": 6, + "area_type": "range", + "protected": false + } + ], + "elevation_min": 1593, + "orientations": [ + "SW" + ], + "version": 2, + "protected": false + }, + { + "type": "r", + "height_diff_difficulties": null, + "geometry": { + "version": 4, + "has_geom_detail": false, + "geom": "{\"coordinates\": [797807.309604503, 5777989.353749002], \"type\": \"Point\"}" + }, + "labande_global_rating": "AD+", + "height_diff_up": 350, + "height_diff_down": 1200, + "ski_exposition": "E1", + "labande_ski_rating": "S4", + "elevation_max": 2476, + "available_langs": [ + "fr" + ], + "locales": [ + { + "summary": null, + "version": 13, + "title": "Couloir S", + "lang": "fr", + "title_prefix": "Tour de Bavon" + } + ], + "ski_rating": "3.3", + "activities": [ + "skitouring" + ], + "document_id": 45226, + "quality": "medium", + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14067, + "locales": [ + { + "version": 1, + "title": "Su\u00efssa", + "lang": "ca" + }, + { + "version": 2, + "title": "Schweiz", + "lang": "de" + }, + { + "version": 1, + "title": "Switzerland", + "lang": "en" + }, + { + "version": 1, + "title": "Suiza", + "lang": "es" + }, + { + "version": 1, + "title": "Suitza", + "lang": "eu" + }, + { + "version": 1, + "title": "Suisse", + "lang": "fr" + }, + { + "version": 1, + "title": "Svizzera", + "lang": "it" + } + ], + "version": 10, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14384, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + }, + { + "version": 1, + "title": "Valais", + "lang": "ca" + }, + { + "version": 1, + "title": "Wallis", + "lang": "de" + }, + { + "version": 1, + "title": "Valais", + "lang": "en" + }, + { + "version": 1, + "title": "Valais", + "lang": "es" + }, + { + "version": 1, + "title": "Valais", + "lang": "eu" + }, + { + "version": 1, + "title": "Vallese", + "lang": "it" + } + ], + "version": 9, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14437, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "version": 6, + "area_type": "range", + "protected": false + } + ], + "elevation_min": 2164, + "orientations": [ + "SE" + ], + "version": 3, + "protected": false + }, + { + "type": "r", + "height_diff_difficulties": null, + "geometry": { + "version": 3, + "has_geom_detail": false, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "labande_global_rating": "PD+", + "height_diff_up": 350, + "height_diff_down": 903, + "ski_exposition": "E1", + "labande_ski_rating": "S3", + "elevation_max": 2476, + "available_langs": [ + "fr" + ], + "locales": [ + { + "summary": null, + "version": 6, + "title": "Le Tour de La Tour", + "lang": "fr", + "title_prefix": "Tour de Bavon" + } + ], + "ski_rating": "2.3", + "activities": [ + "skitouring" + ], + "document_id": 48455, + "quality": "medium", + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14067, + "locales": [ + { + "version": 1, + "title": "Su\u00efssa", + "lang": "ca" + }, + { + "version": 2, + "title": "Schweiz", + "lang": "de" + }, + { + "version": 1, + "title": "Switzerland", + "lang": "en" + }, + { + "version": 1, + "title": "Suiza", + "lang": "es" + }, + { + "version": 1, + "title": "Suitza", + "lang": "eu" + }, + { + "version": 1, + "title": "Suisse", + "lang": "fr" + }, + { + "version": 1, + "title": "Svizzera", + "lang": "it" + } + ], + "version": 10, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14384, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + }, + { + "version": 1, + "title": "Valais", + "lang": "ca" + }, + { + "version": 1, + "title": "Wallis", + "lang": "de" + }, + { + "version": 1, + "title": "Valais", + "lang": "en" + }, + { + "version": 1, + "title": "Valais", + "lang": "es" + }, + { + "version": 1, + "title": "Valais", + "lang": "eu" + }, + { + "version": 1, + "title": "Vallese", + "lang": "it" + } + ], + "version": 9, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14437, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "version": 6, + "area_type": "range", + "protected": false + } + ], + "elevation_min": 2164, + "orientations": [ + "NE" + ], + "version": 2, + "protected": false + }, + { + "type": "r", + "height_diff_difficulties": null, + "geometry": { + "version": 4, + "has_geom_detail": false, + "geom": "{\"coordinates\": [796963.8418227625, 5777640.64308189], \"type\": \"Point\"}" + }, + "labande_global_rating": "AD", + "height_diff_up": 210, + "height_diff_down": 900, + "ski_exposition": "E1", + "labande_ski_rating": "S4", + "elevation_max": 2476, + "available_langs": [ + "fr" + ], + "locales": [ + { + "summary": null, + "version": 11, + "title": "Combe de Grand Tseno", + "lang": "fr", + "title_prefix": "Tour de Bavon" + } + ], + "ski_rating": "3.2", + "activities": [ + "skitouring" + ], + "document_id": 51536, + "quality": "medium", + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14067, + "locales": [ + { + "version": 1, + "title": "Su\u00efssa", + "lang": "ca" + }, + { + "version": 2, + "title": "Schweiz", + "lang": "de" + }, + { + "version": 1, + "title": "Switzerland", + "lang": "en" + }, + { + "version": 1, + "title": "Suiza", + "lang": "es" + }, + { + "version": 1, + "title": "Suitza", + "lang": "eu" + }, + { + "version": 1, + "title": "Suisse", + "lang": "fr" + }, + { + "version": 1, + "title": "Svizzera", + "lang": "it" + } + ], + "version": 10, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14384, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + }, + { + "version": 1, + "title": "Valais", + "lang": "ca" + }, + { + "version": 1, + "title": "Wallis", + "lang": "de" + }, + { + "version": 1, + "title": "Valais", + "lang": "en" + }, + { + "version": 1, + "title": "Valais", + "lang": "es" + }, + { + "version": 1, + "title": "Valais", + "lang": "eu" + }, + { + "version": 1, + "title": "Vallese", + "lang": "it" + } + ], + "version": 9, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14437, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "version": 6, + "area_type": "range", + "protected": false + } + ], + "elevation_min": 2267, + "orientations": [ + "NE" + ], + "version": 4, + "protected": false + }, + { + "hiking_rating": "T3", + "type": "r", + "height_diff_difficulties": null, + "elevation_max": 2562, + "height_diff_up": 1050, + "hiking_mtb_exposition": null, + "protected": false, + "geometry": { + "version": 1, + "has_geom_detail": false, + "geom": "{\"coordinates\": [796650.4217964341, 5776783.784513342], \"type\": \"Point\"}" + }, + "available_langs": [ + "fr" + ], + "locales": [ + { + "lang": "fr", + "title": "Par la Tour de Bavon", + "summary": "Tr\u00e8s joli tour de la Tour de Bavon et du Bec Rond avec vue du le Tour Noir, Dolent, Combins, etc...", + "title_prefix": "Bec Rond", + "version": 3 + } + ], + "activities": [ + "hiking" + ], + "document_id": 280600, + "quality": "medium", + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14067, + "locales": [ + { + "version": 1, + "title": "Su\u00efssa", + "lang": "ca" + }, + { + "version": 2, + "title": "Schweiz", + "lang": "de" + }, + { + "version": 1, + "title": "Switzerland", + "lang": "en" + }, + { + "version": 1, + "title": "Suiza", + "lang": "es" + }, + { + "version": 1, + "title": "Suitza", + "lang": "eu" + }, + { + "version": 1, + "title": "Suisse", + "lang": "fr" + }, + { + "version": 1, + "title": "Svizzera", + "lang": "it" + } + ], + "version": 10, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14384, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + }, + { + "version": 1, + "title": "Valais", + "lang": "ca" + }, + { + "version": 1, + "title": "Wallis", + "lang": "de" + }, + { + "version": 1, + "title": "Valais", + "lang": "en" + }, + { + "version": 1, + "title": "Valais", + "lang": "es" + }, + { + "version": 1, + "title": "Valais", + "lang": "eu" + }, + { + "version": 1, + "title": "Vallese", + "lang": "it" + } + ], + "version": 9, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14437, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "version": 6, + "area_type": "range", + "protected": false + } + ], + "elevation_min": 1573, + "orientations": [ + "E" + ], + "height_diff_down": 1050, + "version": 1 + } + ] + }, + "waypoints": { + "total": 12309, + "documents": [ + { + "version": 2, + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [796139.1870349669, 5775382.358943045], \"type\": \"Point\"}" + }, + "available_langs": [ + "fr" + ], + "type": "w", + "quality": "medium", + "document_id": 37297, + "elevation": 2476, + "locales": [ + { + "summary": null, + "version": 1, + "title": "Tour de Bavon", + "lang": "fr" + } + ], + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14067, + "locales": [ + { + "version": 1, + "title": "Su\u00efssa", + "lang": "ca" + }, + { + "version": 2, + "title": "Schweiz", + "lang": "de" + }, + { + "version": 1, + "title": "Switzerland", + "lang": "en" + }, + { + "version": 1, + "title": "Suiza", + "lang": "es" + }, + { + "version": 1, + "title": "Suitza", + "lang": "eu" + }, + { + "version": 1, + "title": "Suisse", + "lang": "fr" + }, + { + "version": 1, + "title": "Svizzera", + "lang": "it" + } + ], + "version": 10, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14384, + "locales": [ + { + "version": 12, + "title": "Valais", + "lang": "fr" + }, + { + "version": 1, + "title": "Valais", + "lang": "ca" + }, + { + "version": 1, + "title": "Wallis", + "lang": "de" + }, + { + "version": 1, + "title": "Valais", + "lang": "en" + }, + { + "version": 1, + "title": "Valais", + "lang": "es" + }, + { + "version": 1, + "title": "Valais", + "lang": "eu" + }, + { + "version": 1, + "title": "Vallese", + "lang": "it" + } + ], + "version": 9, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14437, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "version": 6, + "area_type": "range", + "protected": false + } + ], + "waypoint_type": "summit", + "protected": false + }, + { + "version": 4, + "geometry": { + "version": 4, + "geom": "{\"coordinates\": [760038.6101291808, 5685520.870455899], \"type\": \"Point\"}" + }, + "available_langs": [ + "fr", + "it" + ], + "type": "w", + "quality": "medium", + "document_id": 153897, + "elevation": 3856, + "locales": [ + { + "summary": null, + "version": 3, + "title": "Travers\u00e9e de la Vanoise", + "lang": "fr" + }, + { + "summary": null, + "version": 1, + "title": "Tour de la Vanoise", + "lang": "it" + } + ], + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14274, + "locales": [ + { + "version": 3, + "title": "Fran\u00e7a", + "lang": "ca" + }, + { + "version": 1, + "title": "Frankreich", + "lang": "de" + }, + { + "version": 1, + "title": "France", + "lang": "en" + }, + { + "version": 1, + "title": "Francia", + "lang": "es" + }, + { + "version": 2, + "title": "France", + "lang": "eu" + }, + { + "version": 5, + "title": "France", + "lang": "fr" + }, + { + "version": 1, + "title": "Francia", + "lang": "it" + } + ], + "version": 11, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14295, + "locales": [ + { + "version": 1, + "title": "Savoia", + "lang": "ca" + }, + { + "version": 1, + "title": "Savoie", + "lang": "de" + }, + { + "version": 1, + "title": "Savoie", + "lang": "en" + }, + { + "version": 1, + "title": "Saboya", + "lang": "es" + }, + { + "version": 1, + "title": "Savoia", + "lang": "eu" + }, + { + "version": 2, + "title": "Savoie", + "lang": "fr" + }, + { + "version": 1, + "title": "Savoia", + "lang": "it" + } + ], + "version": 2, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14409, + "locales": [ + { + "version": 8, + "title": "Vanoise", + "lang": "fr" + } + ], + "version": 4, + "area_type": "range", + "protected": false + } + ], + "waypoint_type": "virtual", + "protected": false + }, + { + "version": 2, + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [826221.275671013, 5764098.826443765], \"type\": \"Point\"}" + }, + "available_langs": [ + "it" + ], + "type": "w", + "quality": "medium", + "document_id": 712035, + "elevation": 3058, + "locales": [ + { + "summary": null, + "version": 1, + "title": "Tour de la Tsa", + "lang": "it" + } + ], + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14270, + "locales": [ + { + "version": 1, + "title": "It\u00e0lia", + "lang": "ca" + }, + { + "version": 1, + "title": "Italien", + "lang": "de" + }, + { + "version": 1, + "title": "Italy", + "lang": "en" + }, + { + "version": 1, + "title": "Italia", + "lang": "es" + }, + { + "version": 1, + "title": "Italia", + "lang": "eu" + }, + { + "version": 2, + "title": "Italie", + "lang": "fr" + }, + { + "version": 2, + "title": "Italia", + "lang": "it" + } + ], + "version": 9, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14437, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "version": 6, + "area_type": "range", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 280072, + "locales": [ + { + "version": 4, + "title": "Vall\u00e9e d'Aoste", + "lang": "fr" + }, + { + "version": 1, + "title": "Vall d'Aosta", + "lang": "ca" + }, + { + "version": 1, + "title": "Aostatal", + "lang": "de" + }, + { + "version": 1, + "title": "Aosta Valley", + "lang": "en" + }, + { + "version": 1, + "title": "Valle de Aosta", + "lang": "es" + }, + { + "version": 1, + "title": "Aostako Harana", + "lang": "eu" + }, + { + "version": 1, + "title": "Valle d'Aosta", + "lang": "it" + } + ], + "version": 1, + "area_type": "admin_limits", + "protected": false + } + ], + "waypoint_type": "summit", + "protected": false + }, + { + "version": 2, + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [727957.2234384847, 5621013.790233994], \"type\": \"Point\"}" + }, + "available_langs": [ + "fr", + "it" + ], + "type": "w", + "quality": "medium", + "document_id": 41546, + "elevation": 2767, + "locales": [ + { + "summary": null, + "version": 1, + "title": "Vallon de la Moulette - 1\u00e8re Tour", + "lang": "fr" + }, + { + "summary": null, + "version": 1, + "title": "Vallon de la Moulette - 1\u00e8re Tour", + "lang": "it" + } + ], + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14274, + "locales": [ + { + "version": 3, + "title": "Fran\u00e7a", + "lang": "ca" + }, + { + "version": 1, + "title": "Frankreich", + "lang": "de" + }, + { + "version": 1, + "title": "France", + "lang": "en" + }, + { + "version": 1, + "title": "Francia", + "lang": "es" + }, + { + "version": 2, + "title": "France", + "lang": "eu" + }, + { + "version": 5, + "title": "France", + "lang": "fr" + }, + { + "version": 1, + "title": "Francia", + "lang": "it" + } + ], + "version": 11, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14361, + "locales": [ + { + "version": 1, + "title": "Alts Alps", + "lang": "ca" + }, + { + "version": 1, + "title": "Hautes-Alpes", + "lang": "de" + }, + { + "version": 1, + "title": "Hautes-Alpes", + "lang": "en" + }, + { + "version": 1, + "title": "Altos Alpes", + "lang": "es" + }, + { + "version": 1, + "title": "Alpe Garaiak", + "lang": "eu" + }, + { + "version": 4, + "title": "Hautes-Alpes", + "lang": "fr" + }, + { + "version": 1, + "title": "Alte Alpi", + "lang": "it" + } + ], + "version": 4, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 252522, + "locales": [ + { + "version": 5, + "title": "Cerces - Thabor - Mont-Cenis", + "lang": "fr" + }, + { + "version": 2, + "title": "Tabor \u2013 Moncenisio", + "lang": "it" + } + ], + "version": 1, + "area_type": "range", + "protected": false + } + ], + "waypoint_type": "summit", + "protected": false + }, + { + "version": 2, + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [716585.826134461, 5630856.693049101], \"type\": \"Point\"}" + }, + "available_langs": [ + "fr", + "it" + ], + "type": "w", + "document_id": 39495, + "quality": "medium", + "locales": [ + { + "summary": null, + "version": 1, + "title": "Tour Termier", + "lang": "fr" + }, + { + "summary": null, + "version": 1, + "title": "Tour Termier", + "lang": "it" + } + ], + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14274, + "locales": [ + { + "version": 3, + "title": "Fran\u00e7a", + "lang": "ca" + }, + { + "version": 1, + "title": "Frankreich", + "lang": "de" + }, + { + "version": 1, + "title": "France", + "lang": "en" + }, + { + "version": 1, + "title": "Francia", + "lang": "es" + }, + { + "version": 2, + "title": "France", + "lang": "eu" + }, + { + "version": 5, + "title": "France", + "lang": "fr" + }, + { + "version": 1, + "title": "Francia", + "lang": "it" + } + ], + "version": 11, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14361, + "locales": [ + { + "version": 1, + "title": "Alts Alps", + "lang": "ca" + }, + { + "version": 1, + "title": "Hautes-Alpes", + "lang": "de" + }, + { + "version": 1, + "title": "Hautes-Alpes", + "lang": "en" + }, + { + "version": 1, + "title": "Altos Alpes", + "lang": "es" + }, + { + "version": 1, + "title": "Alpe Garaiak", + "lang": "eu" + }, + { + "version": 4, + "title": "Hautes-Alpes", + "lang": "fr" + }, + { + "version": 1, + "title": "Alte Alpi", + "lang": "it" + } + ], + "version": 4, + "area_type": "admin_limits", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 252522, + "locales": [ + { + "version": 5, + "title": "Cerces - Thabor - Mont-Cenis", + "lang": "fr" + }, + { + "version": 2, + "title": "Tabor \u2013 Moncenisio", + "lang": "it" + } + ], + "version": 1, + "area_type": "range", + "protected": false + } + ], + "protected": false, + "waypoint_type": "summit", + "elevation": 3070 + }, + { + "geometry": { + "version": 1, + "geom": "{\"coordinates\": [1241605.2801475015, 5936291.27970698], \"type\": \"Point\"}" + }, + "available_langs": [ + "fr", + "it" + ], + "locales": [ + { + "lang": "fr", + "title": "Tour du Stubai", + "summary": null, + "version": 2 + }, + { + "lang": "it", + "title": "Stubai Tour", + "summary": null, + "version": 6 + } + ], + "elevation": 3508, + "document_id": 341497, + "quality": "medium", + "type": "w", + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14257, + "locales": [ + { + "version": 9, + "title": "Autriche", + "lang": "fr" + }, + { + "version": 1, + "title": "\u00c0ustria", + "lang": "ca" + }, + { + "version": 1, + "title": "\u00d6sterreich", + "lang": "de" + }, + { + "version": 1, + "title": "Austria", + "lang": "en" + }, + { + "version": 1, + "title": "Austria", + "lang": "es" + }, + { + "version": 1, + "title": "Austria", + "lang": "eu" + }, + { + "version": 1, + "title": "Austria", + "lang": "it" + } + ], + "version": 8, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14434, + "locales": [ + { + "version": 1, + "title": "Stubaier Alpen - Sarntaler Alpen", + "lang": "de" + }, + { + "version": 1, + "title": "Stubai Alps - Sarntal Alps", + "lang": "en" + }, + { + "version": 2, + "title": "Alpes de Stubai - Alpes de Sarntal", + "lang": "fr" + }, + { + "version": 4, + "title": "Alpi dello Stubai - Alpi Sarentine", + "lang": "it" + } + ], + "version": 5, + "area_type": "range", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 282685, + "locales": [ + { + "version": 2, + "title": "Tyrol", + "lang": "fr" + }, + { + "version": 1, + "title": "Tirol", + "lang": "ca" + }, + { + "version": 1, + "title": "Tirol", + "lang": "de" + }, + { + "version": 1, + "title": "Tyrol", + "lang": "en" + }, + { + "version": 1, + "title": "Tirol", + "lang": "es" + }, + { + "version": 1, + "title": "Tirol", + "lang": "eu" + }, + { + "version": 1, + "title": "Tirolo", + "lang": "it" + } + ], + "version": 1, + "area_type": "admin_limits", + "protected": false + } + ], + "waypoint_type": "virtual", + "version": 1, + "protected": false + }, + { + "version": 2, + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [111869.85435575506, 5270001.041891228], \"type\": \"Point\"}" + }, + "available_langs": [ + "eu", + "fr" + ], + "type": "w", + "quality": "medium", + "document_id": 192317, + "elevation": 2590, + "locales": [ + { + "summary": null, + "version": 1, + "title": "Tuc de Beret", + "lang": "eu" + }, + { + "summary": null, + "version": 1, + "title": "Tuc de Beret", + "lang": "fr" + } + ], + "areas": [ + { + "available_langs": null, + "type": "a", + "document_id": 14267, + "locales": [ + { + "version": 4, + "title": "Espa\u00f1a", + "lang": "ca" + }, + { + "version": 1, + "title": "Spanien", + "lang": "de" + }, + { + "version": 1, + "title": "Spain", + "lang": "en" + }, + { + "version": 1, + "title": "Espa\u00f1a", + "lang": "es" + }, + { + "version": 1, + "title": "Espainia", + "lang": "eu" + }, + { + "version": 4, + "title": "Espagne", + "lang": "fr" + }, + { + "version": 1, + "title": "Spagna", + "lang": "it" + } + ], + "version": 12, + "area_type": "country", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 14469, + "locales": [ + { + "version": 6, + "title": "Couserans - Aran N", + "lang": "ca" + }, + { + "version": 1, + "title": "Couserans - Aran N", + "lang": "en" + }, + { + "version": 4, + "title": "Couserans - Aran N", + "lang": "es" + }, + { + "version": 6, + "title": "Couserans - Aran N", + "lang": "fr" + } + ], + "version": 17, + "area_type": "range", + "protected": false + }, + { + "available_langs": null, + "type": "a", + "document_id": 279949, + "locales": [ + { + "version": 1, + "title": "Prov\u00edncia de Lleida", + "lang": "ca" + }, + { + "version": 1, + "title": "Provinz Lleida", + "lang": "de" + }, + { + "version": 1, + "title": "Province of Lleida", + "lang": "en" + }, + { + "version": 1, + "title": "Provincia de L\u00e9rida", + "lang": "es" + }, + { + "version": 1, + "title": "Lleidako probintzia", + "lang": "eu" + }, + { + "version": 2, + "title": "Province de Lleida", + "lang": "fr" + }, + { + "version": 1, + "title": "Provincia di Lleida", + "lang": "it" + } + ], + "version": 1, + "area_type": "admin_limits", + "protected": false + } + ], + "waypoint_type": "summit", + "protected": false + } + ] + } +} +--- +[ + { + "id": "57103", + "title": "Tour de Bavon : Thor", + "summary": "Belle et longue voie équipée sur des dalles compactes qui sort sous le sommet. ", + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "48341", + "title": "Tour de Bavon : Depuis Vichères", + "summary": null, + "activities": [ + "SKITOURING" + ] + }, + { + "id": "931643", + "title": "Tour de Bavon : Arête W", + "summary": "Cet itinéraire est le même que celui utilisé par les randonneurs à skis.", + "activities": [ + "HIKING" + ] + }, + { + "id": "45226", + "title": "Tour de Bavon : Couloir S", + "summary": null, + "activities": [ + "SKITOURING" + ] + }, + { + "id": "48455", + "title": "Tour de Bavon : Le Tour de La Tour", + "summary": null, + "activities": [ + "SKITOURING" + ] + }, + { + "id": "51536", + "title": "Tour de Bavon : Combe de Grand Tseno", + "summary": null, + "activities": [ + "SKITOURING" + ] + }, + { + "id": "280600", + "title": "Bec Rond : Par la Tour de Bavon", + "summary": "Très joli tour de la Tour de Bavon et du Bec Rond avec vue du le Tour Noir, Dolent, Combins, etc...", + "activities": [ + "HIKING" + ] + } +] diff --git a/src/test/resources/search/portalet b/src/test/resources/search/portalet new file mode 100644 index 0000000..d9d35b6 --- /dev/null +++ b/src/test/resources/search/portalet @@ -0,0 +1,62 @@ +petit clocher du portalet +--- +{"waypoints": {"documents": [{"waypoint_type": "summit", "available_langs": ["fr"], "geometry": {"version": 2, "geom": "{\"coordinates\": [787121.5290442754, 5779236.509207667], \"type\": \"Point\"}"}, "areas": [{"available_langs": null, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "protected": false, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"available_langs": null, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "protected": false, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"available_langs": null, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "protected": false, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "document_id": 40559, "type": "w", "version": 2, "protected": false, "elevation": 2823, "locales": [{"version": 12, "title": "Petit Clocher du Portalet", "lang": "fr", "summary": "Le Petit Clocher du Portalet est un sommet renomm\u00e9 pour ses escalades raides et athl\u00e9tiques uniques dans le massif du Mont Blanc."}], "quality": "medium"}, {"waypoint_type": "summit", "protected": false, "geometry": {"version": 2, "geom": "{\"coordinates\": [786660.6340611434, 5779094.078961194], \"type\": \"Point\"}"}, "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "available_langs": null, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "available_langs": null, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "available_langs": null, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "document_id": 222956, "type": "w", "version": 1, "available_langs": ["fr"], "elevation": 2983, "locales": [{"summary": null, "title": "Grand clocher du Portalet", "lang": "fr", "version": 1}], "quality": "medium"}, {"waypoint_type": "summit", "protected": false, "type": "w", "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14274, "version": 11, "available_langs": null, "locales": [{"version": 3, "title": "Fran\u00e7a", "lang": "ca"}, {"version": 1, "title": "Frankreich", "lang": "de"}, {"version": 1, "title": "France", "lang": "en"}, {"version": 1, "title": "Francia", "lang": "es"}, {"version": 2, "title": "France", "lang": "eu"}, {"version": 5, "title": "France", "lang": "fr"}, {"version": 1, "title": "Francia", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14366, "version": 3, "available_langs": null, "locales": [{"version": 3, "title": "Alta Savoia", "lang": "it"}, {"version": 1, "title": "Alta Savoia", "lang": "ca"}, {"version": 1, "title": "Haute-Savoie", "lang": "de"}, {"version": 1, "title": "Haute-Savoie", "lang": "en"}, {"version": 1, "title": "Alta Saboya", "lang": "es"}, {"version": 1, "title": "Savoia Garaia", "lang": "eu"}, {"version": 3, "title": "Haute-Savoie", "lang": "fr"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "available_langs": null, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "document_id": 903001, "version": 1, "available_langs": ["fr"], "elevation": 3682, "locales": [{"version": 2, "title": "Petit clocher du Tacul", "lang": "fr", "summary": "Fl\u00e8che \u00e9lanc\u00e9e entre le Trident et la Chandelle. "}], "quality": "fine", "geometry": {"version": 3, "geom": "{\"coordinates\": [767956.851538331, 5756516.342440388], \"type\": \"Point\"}"}}, {"waypoint_type": "hut", "available_langs": ["fr", "it"], "geometry": {"version": 3, "geom": "{\"coordinates\": [766254.913134058, 5655582.3880674755], \"type\": \"Point\"}"}, "areas": [{"available_langs": null, "area_type": "country", "type": "a", "document_id": 14274, "version": 11, "protected": false, "locales": [{"version": 3, "title": "Fran\u00e7a", "lang": "ca"}, {"version": 1, "title": "Frankreich", "lang": "de"}, {"version": 1, "title": "France", "lang": "en"}, {"version": 1, "title": "Francia", "lang": "es"}, {"version": 2, "title": "France", "lang": "eu"}, {"version": 5, "title": "France", "lang": "fr"}, {"version": 1, "title": "Francia", "lang": "it"}]}, {"available_langs": null, "area_type": "admin_limits", "type": "a", "document_id": 14295, "version": 2, "protected": false, "locales": [{"version": 1, "title": "Savoia", "lang": "ca"}, {"version": 1, "title": "Savoie", "lang": "de"}, {"version": 1, "title": "Savoie", "lang": "en"}, {"version": 1, "title": "Saboya", "lang": "es"}, {"version": 1, "title": "Savoia", "lang": "eu"}, {"version": 2, "title": "Savoie", "lang": "fr"}, {"version": 1, "title": "Savoia", "lang": "it"}]}, {"available_langs": null, "area_type": "range", "type": "a", "document_id": 252522, "version": 1, "protected": false, "locales": [{"version": 5, "title": "Cerces - Thabor - Mont-Cenis", "lang": "fr"}, {"version": 2, "title": "Tabor \u2013 Moncenisio", "lang": "it"}]}], "document_id": 493328, "type": "w", "version": 3, "protected": false, "elevation": 2110, "locales": [{"version": 1, "title": "Refuge du Petit Mont Cenis", "lang": "fr", "summary": null}, {"version": 4, "title": "Refuge du Petit Mont Cenis", "lang": "it", "summary": null}], "quality": "medium"}, {"waypoint_type": "access", "protected": false, "type": "w", "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14274, "version": 11, "available_langs": null, "locales": [{"version": 3, "title": "Fran\u00e7a", "lang": "ca"}, {"version": 1, "title": "Frankreich", "lang": "de"}, {"version": 1, "title": "France", "lang": "en"}, {"version": 1, "title": "Francia", "lang": "es"}, {"version": 2, "title": "France", "lang": "eu"}, {"version": 5, "title": "France", "lang": "fr"}, {"version": 1, "title": "Francia", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14295, "version": 2, "available_langs": null, "locales": [{"version": 1, "title": "Savoia", "lang": "ca"}, {"version": 1, "title": "Savoie", "lang": "de"}, {"version": 1, "title": "Savoie", "lang": "en"}, {"version": 1, "title": "Saboya", "lang": "es"}, {"version": 1, "title": "Savoia", "lang": "eu"}, {"version": 2, "title": "Savoie", "lang": "fr"}, {"version": 1, "title": "Savoia", "lang": "it"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 252522, "version": 1, "available_langs": null, "locales": [{"version": 5, "title": "Cerces - Thabor - Mont-Cenis", "lang": "fr"}, {"version": 2, "title": "Tabor \u2013 Moncenisio", "lang": "it"}]}], "document_id": 185780, "version": 2, "available_langs": ["fr", "it"], "elevation": 2183, "locales": [{"version": 1, "title": "Col du Petit Mont Cenis - les Coulours", "lang": "fr", "summary": null}, {"version": 1, "title": "Col du Petit Mont Cenis - les Coulours", "lang": "it", "summary": null}], "quality": "medium", "geometry": {"version": 2, "geom": "{\"coordinates\": [764265.5225140911, 5654754.052609252], \"type\": \"Point\"}"}}, {"waypoint_type": "summit", "protected": false, "geometry": {"version": 4, "geom": "{\"coordinates\": [787802.9156474215, 5776935.575950546], \"type\": \"Point\"}"}, "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "available_langs": null, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "available_langs": null, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "available_langs": null, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "document_id": 40634, "type": "w", "version": 5, "available_langs": ["fr"], "elevation": 2699, "locales": [{"version": 8, "title": "Petit Clocher des Planereuses", "lang": "fr", "summary": "Le bon granit des Planereuses offre des voies abordables."}], "quality": "draft"}, {"waypoint_type": "climbing_outdoor", "protected": false, "type": "w", "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "available_langs": null, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "available_langs": null, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "available_langs": null, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "document_id": 177854, "version": 1, "available_langs": ["fr"], "elevation": 2400, "locales": [{"version": 1, "title": "Contreforts E des Clochers du Portalet", "lang": "fr", "summary": null}], "quality": "medium", "geometry": {"version": 1, "geom": "{\"coordinates\": [787659.3135042969, 5778999.210874604], \"type\": \"Point\"}"}}], "total": 3480}, "routes": {"documents": [{"engagement_rating": "II", "type": "r", "rock_free_rating": "6a", "available_langs": ["fr", "es"], "protected": false, "orientations": ["S", "SW", "W"], "aid_rating": null, "rock_required_rating": "5b", "height_diff_difficulties": 300, "height_diff_down": null, "global_rating": "D+", "quality": "fine", "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "available_langs": null, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "available_langs": null, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "available_langs": null, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "activities": ["mountain_climbing"], "equipment_rating": "P2", "elevation_max": 2823, "locales": [{"summary": null, "title": "Ar\u00eate W", "title_prefix": "Petit Clocher du Portalet", "lang": "fr", "version": 8}, {"summary": null, "title": "Arista W", "title_prefix": "Petit Clocher du Portalet", "lang": "es", "version": 1}], "document_id": 899594, "height_diff_up": null, "exposition_rock_rating": null, "risk_rating": null, "version": 6, "elevation_min": null, "geometry": {"version": 6, "has_geom_detail": false, "geom": "{\"coordinates\": [786677.1972967733, 5779945.0253837975], \"type\": \"Point\"}"}}, {"engagement_rating": "II", "type": "r", "height_diff_up": 280, "elevation_min": 2560, "available_langs": ["fr"], "aid_rating": null, "rock_required_rating": "6a+", "height_diff_difficulties": null, "geometry": {"version": 4, "has_geom_detail": false, "geom": "{\"coordinates\": [790107.1255829744, 5780934.582000861], \"type\": \"Point\"}"}, "global_rating": "ED-", "protected": false, "risk_rating": null, "areas": [{"available_langs": null, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "protected": false, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"available_langs": null, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "protected": false, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"available_langs": null, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "protected": false, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "activities": ["rock_climbing"], "equipment_rating": "P2", "elevation_max": 2823, "locales": [{"version": 16, "title": "Plaisir imm\u00e9diat", "title_prefix": "Petit Clocher du Portalet", "lang": "fr", "summary": null}], "document_id": 291859, "rock_free_rating": "6c", "exposition_rock_rating": null, "quality": "medium", "orientations": ["NE"], "version": 4, "height_diff_down": null}, {"engagement_rating": "II", "type": "r", "height_diff_up": null, "elevation_min": null, "available_langs": ["fr"], "aid_rating": null, "rock_required_rating": null, "height_diff_difficulties": 200, "geometry": {"version": 3, "has_geom_detail": false, "geom": "{\"coordinates\": [790107.1255829744, 5780934.582000861], \"type\": \"Point\"}"}, "global_rating": "ED+", "protected": false, "risk_rating": null, "areas": [{"available_langs": null, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "protected": false, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"available_langs": null, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "protected": false, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"available_langs": null, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "protected": false, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "activities": ["rock_climbing"], "equipment_rating": "P2", "elevation_max": 2823, "locales": [{"version": 21, "title": "Esprit de clocher", "title_prefix": "Petit Clocher du Portalet", "lang": "fr", "summary": "Belle ligne de fissures \u00e0 gauche de la voie des chemin\u00e9es.\r\nLa voie rejoint la SE sur les 2 derni\u00e8res longueurs."}], "document_id": 454682, "rock_free_rating": "7a", "exposition_rock_rating": null, "quality": "medium", "orientations": ["E"], "version": 3, "height_diff_down": null}, {"engagement_rating": "III", "type": "r", "height_diff_up": 1330, "available_langs": ["fr"], "protected": false, "orientations": ["N"], "aid_rating": null, "rock_required_rating": "6b+", "height_diff_difficulties": 280, "height_diff_down": null, "global_rating": "ED+", "quality": "fine", "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "available_langs": null, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "available_langs": null, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "available_langs": null, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "activities": ["rock_climbing"], "equipment_rating": "P2+", "elevation_max": 2823, "locales": [{"version": 19, "title": "\u00c9tat de Choc", "title_prefix": "Petit Clocher du Portalet", "lang": "fr", "summary": null}], "document_id": 182781, "rock_free_rating": "7a", "exposition_rock_rating": null, "risk_rating": null, "version": 5, "elevation_min": 1500, "geometry": {"version": 5, "has_geom_detail": false, "geom": "{\"coordinates\": [789177.8783379544, 5782264.058392277], \"type\": \"Point\"}"}}, {"engagement_rating": null, "type": "r", "rock_free_rating": "6c", "available_langs": ["es", "fr"], "protected": false, "orientations": ["SE"], "aid_rating": null, "rock_required_rating": "6b", "height_diff_difficulties": 450, "height_diff_down": null, "global_rating": "ED", "quality": "draft", "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "available_langs": null, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "available_langs": null, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "available_langs": null, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "activities": ["mountain_climbing"], "equipment_rating": "P1+", "elevation_max": 2983, "locales": [{"summary": null, "title": "la face cach\u00e9e de la lune", "title_prefix": "Grand clocher du Portalet", "lang": "es", "version": 2}, {"summary": "Voie en 11 longueurs", "title": "La face cach\u00e9e de la lune", "title_prefix": "Grand clocher du Portalet", "lang": "fr", "version": 2}], "document_id": 945711, "height_diff_up": null, "exposition_rock_rating": null, "risk_rating": null, "version": 1, "elevation_min": null, "geometry": {"version": 3, "has_geom_detail": false, "geom": "{\"coordinates\": [789530.0084432551, 5778098.867360009], \"type\": \"Point\"}"}}, {"engagement_rating": "III", "type": "r", "rock_free_rating": "6c", "available_langs": ["fr"], "protected": false, "orientations": null, "aid_rating": null, "rock_required_rating": null, "height_diff_difficulties": null, "height_diff_down": null, "global_rating": "ED-", "quality": "medium", "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "available_langs": null, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "available_langs": null, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "available_langs": null, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "activities": ["rock_climbing"], "equipment_rating": "P2", "elevation_max": 2823, "locales": [{"summary": null, "title": "Au fil du temps", "title_prefix": "Petit Clocher du Portalet", "lang": "fr", "version": 8}], "document_id": 282805, "height_diff_up": 673, "exposition_rock_rating": null, "risk_rating": null, "version": 2, "elevation_min": 1150, "geometry": {"version": 2, "has_geom_detail": false, "geom": "{\"coordinates\": [790107.1255829744, 5780934.582000861], \"type\": \"Point\"}"}}, {"engagement_rating": "II", "type": "r", "rock_free_rating": "6c", "available_langs": ["fr"], "protected": false, "orientations": ["SE"], "aid_rating": null, "rock_required_rating": "6a", "height_diff_difficulties": 300, "height_diff_down": 673, "global_rating": "TD+", "quality": "great", "areas": [{"protected": false, "area_type": "country", "type": "a", "document_id": 14067, "version": 10, "available_langs": null, "locales": [{"version": 1, "title": "Su\u00efssa", "lang": "ca"}, {"version": 2, "title": "Schweiz", "lang": "de"}, {"version": 1, "title": "Switzerland", "lang": "en"}, {"version": 1, "title": "Suiza", "lang": "es"}, {"version": 1, "title": "Suitza", "lang": "eu"}, {"version": 1, "title": "Suisse", "lang": "fr"}, {"version": 1, "title": "Svizzera", "lang": "it"}]}, {"protected": false, "area_type": "admin_limits", "type": "a", "document_id": 14384, "version": 9, "available_langs": null, "locales": [{"version": 12, "title": "Valais", "lang": "fr"}, {"version": 1, "title": "Valais", "lang": "ca"}, {"version": 1, "title": "Wallis", "lang": "de"}, {"version": 1, "title": "Valais", "lang": "en"}, {"version": 1, "title": "Valais", "lang": "es"}, {"version": 1, "title": "Valais", "lang": "eu"}, {"version": 1, "title": "Vallese", "lang": "it"}]}, {"protected": false, "area_type": "range", "type": "a", "document_id": 14410, "version": 19, "available_langs": null, "locales": [{"version": 39, "title": "Mont-Blanc", "lang": "fr"}, {"version": 3, "title": "Monte Bianco", "lang": "it"}, {"version": 1, "title": "Mont-Blanc", "lang": "ca"}, {"version": 1, "title": "Montblanc", "lang": "de"}, {"version": 1, "title": "Mont-Blanc", "lang": "en"}, {"version": 1, "title": "Mont-Blanc", "lang": "es"}, {"version": 1, "title": "Mont-Blanc", "lang": "eu"}]}], "activities": ["rock_climbing"], "equipment_rating": "P2", "elevation_max": 2823, "locales": [{"summary": "[img=377705 right]Pilier SE[/img]", "title": "Pilier SE", "title_prefix": "Petit Clocher du Portalet", "lang": "fr", "version": 22}], "document_id": 54439, "height_diff_up": 673, "exposition_rock_rating": null, "risk_rating": null, "version": 10, "elevation_min": 1150, "geometry": {"version": 12, "has_geom_detail": false, "geom": "{\"coordinates\": [787233.9117732822, 5779125.570046455], \"type\": \"Point\"}"}}], "total": 7916}} +--- +[ + { + "id": "899594", + "title": "Petit Clocher du Portalet : Arête W", + "summary": null, + "activities": [ + "MOUNTAIN_CLIMBING" + ] + }, + { + "id": "291859", + "title": "Petit Clocher du Portalet : Plaisir immédiat", + "summary": null, + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "454682", + "title": "Petit Clocher du Portalet : Esprit de clocher", + "summary": "Belle ligne de fissures à gauche de la voie des cheminées.\r\nLa voie rejoint la SE sur les 2 dernières longueurs.", + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "182781", + "title": "Petit Clocher du Portalet : État de Choc", + "summary": null, + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "945711", + "title": "Grand clocher du Portalet : La face cachée de la lune", + "summary": "Voie en 11 longueurs", + "activities": [ + "MOUNTAIN_CLIMBING" + ] + }, + { + "id": "282805", + "title": "Petit Clocher du Portalet : Au fil du temps", + "summary": null, + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "54439", + "title": "Petit Clocher du Portalet : Pilier SE", + "summary": "[img=377705 right]Pilier SE[/img]", + "activities": [ + "ROCK_CLIMBING" + ] + } +] diff --git a/src/test/resources/search/test b/src/test/resources/search/test new file mode 100644 index 0000000..dffedc1 --- /dev/null +++ b/src/test/resources/search/test @@ -0,0 +1,1386 @@ +test +--- +{ + "routes": { + "total": 68, + "documents": [ + { + "orientations": ["W"], + "document_id": 787783, + "equipment_rating": "P1+", + "version": 1, + "activities": ["rock_climbing"], + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [785887.2185303594, 5503079.261884442], \"type\": \"Point\"}" + }, + "available_langs": ["es", "it"], + "aid_rating": null, + "risk_rating": null, + "areas": [ + { + "type": "a", + "available_langs": null, + "document_id": 14270, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 14466, + "version": 1, + "locales": [ + { "version": 7, "title": "Mercantour - Argentera", "lang": "fr" } + ], + "area_type": "range", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 280000, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Prov\u00edncia de Cuneo", + "lang": "ca" + }, + { "version": 1, "title": "Provinz Cuneo", "lang": "de" }, + { "version": 1, "title": "Province of Cuneo", "lang": "en" }, + { "version": 1, "title": "Provincia de Cuneo", "lang": "es" }, + { "version": 1, "title": "Cuneoko probintzia", "lang": "eu" }, + { "version": 1, "title": "Province de Coni", "lang": "fr" }, + { "version": 1, "title": "Provincia di Cuneo", "lang": "it" } + ], + "area_type": "admin_limits", + "protected": false + } + ], + "exposition_rock_rating": "E1", + "height_diff_down": null, + "elevation_min": 2100, + "elevation_max": 2260, + "engagement_rating": "I", + "locales": [ + { + "lang": "es", + "title_prefix": "Testa del Vallonetto", + "title": "Occhi Blu", + "version": 5, + "summary": null + }, + { + "lang": "it", + "title_prefix": "Testa del Vallonetto", + "title": "Occhi Blu", + "version": 1, + "summary": null + } + ], + "protected": false, + "rock_required_rating": "5b", + "rock_free_rating": "5b", + "type": "r", + "height_diff_difficulties": 160, + "height_diff_up": 160, + "global_rating": "TD-", + "quality": "medium" + }, + { + "orientations": ["W"], + "document_id": 363730, + "equipment_rating": "P1", + "version": 2, + "activities": ["rock_climbing"], + "geometry": { + "has_geom_detail": false, + "version": 2, + "geom": "{\"coordinates\": [785268.6903330158, 5504622.619897542], \"type\": \"Point\"}" + }, + "available_langs": ["es", "fr"], + "aid_rating": null, + "risk_rating": null, + "areas": [ + { + "type": "a", + "area_type": "country", + "available_langs": null, + "document_id": 14270, + "version": 9, + "locales": [ + { "version": 1, "lang": "ca", "title": "It\u00e0lia" }, + { "version": 1, "lang": "de", "title": "Italien" }, + { "version": 1, "lang": "en", "title": "Italy" }, + { "version": 1, "lang": "es", "title": "Italia" }, + { "version": 1, "lang": "eu", "title": "Italia" }, + { "version": 2, "lang": "fr", "title": "Italie" }, + { "version": 2, "lang": "it", "title": "Italia" } + ], + "protected": false + }, + { + "type": "a", + "area_type": "range", + "available_langs": null, + "document_id": 14466, + "version": 1, + "locales": [ + { "version": 7, "lang": "fr", "title": "Mercantour - Argentera" } + ], + "protected": false + }, + { + "type": "a", + "area_type": "admin_limits", + "available_langs": null, + "document_id": 280000, + "version": 1, + "locales": [ + { + "version": 1, + "lang": "ca", + "title": "Prov\u00edncia de Cuneo" + }, + { "version": 1, "lang": "de", "title": "Provinz Cuneo" }, + { "version": 1, "lang": "en", "title": "Province of Cuneo" }, + { "version": 1, "lang": "es", "title": "Provincia de Cuneo" }, + { "version": 1, "lang": "eu", "title": "Cuneoko probintzia" }, + { "version": 1, "lang": "fr", "title": "Province de Coni" }, + { "version": 1, "lang": "it", "title": "Provincia di Cuneo" } + ], + "protected": false + } + ], + "exposition_rock_rating": null, + "height_diff_down": null, + "elevation_min": null, + "height_diff_difficulties": 120, + "engagement_rating": "I", + "locales": [ + { + "version": 3, + "summary": "V\u00eda con buena roca, sobre todo en placa.", + "title_prefix": "Testa del Vallonetto", + "title": "Luna", + "lang": "es" + }, + { + "version": 4, + "summary": "Voie sur bon rocher, majoritairement dalle.", + "title_prefix": "Testa del Vallonetto", + "title": "Luna", + "lang": "fr" + } + ], + "protected": false, + "rock_required_rating": "5b", + "rock_free_rating": "5b", + "height_diff_up": null, + "elevation_max": null, + "type": "r", + "global_rating": "D", + "quality": "medium" + }, + { + "orientations": ["SW"], + "document_id": 805196, + "equipment_rating": "P1+", + "version": 2, + "activities": ["rock_climbing"], + "geometry": { + "has_geom_detail": false, + "version": 2, + "geom": "{\"coordinates\": [794926.6951412449, 5501965.498847357], \"type\": \"Point\"}" + }, + "available_langs": ["es", "fr"], + "aid_rating": null, + "risk_rating": null, + "areas": [ + { + "type": "a", + "document_id": 14270, + "available_langs": null, + "protected": false, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country" + }, + { + "type": "a", + "document_id": 14466, + "available_langs": null, + "protected": false, + "version": 1, + "locales": [ + { "version": 7, "title": "Mercantour - Argentera", "lang": "fr" } + ], + "area_type": "range" + }, + { + "type": "a", + "document_id": 280000, + "available_langs": null, + "protected": false, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Prov\u00edncia de Cuneo", + "lang": "ca" + }, + { "version": 1, "title": "Provinz Cuneo", "lang": "de" }, + { "version": 1, "title": "Province of Cuneo", "lang": "en" }, + { "version": 1, "title": "Provincia de Cuneo", "lang": "es" }, + { "version": 1, "title": "Cuneoko probintzia", "lang": "eu" }, + { "version": 1, "title": "Province de Coni", "lang": "fr" }, + { "version": 1, "title": "Provincia di Cuneo", "lang": "it" } + ], + "area_type": "admin_limits" + } + ], + "quality": "draft", + "height_diff_down": null, + "elevation_min": 2210, + "elevation_max": 2620, + "engagement_rating": "II", + "locales": [ + { + "lang": "es", + "version": 4, + "summary": null, + "title": "Eroi Di Cartone", + "title_prefix": "Testa Gias dei Laghi" + }, + { + "lang": "fr", + "version": 4, + "summary": null, + "title": "Eroi Di Cartone", + "title_prefix": "Testa Gias dei Laghi" + } + ], + "protected": false, + "rock_required_rating": "6a", + "rock_free_rating": "6b", + "height_diff_up": 500, + "exposition_rock_rating": null, + "height_diff_difficulties": 260, + "type": "r", + "global_rating": "TD-" + }, + { + "orientations": ["SW"], + "document_id": 895869, + "equipment_rating": null, + "version": 1, + "activities": ["rock_climbing"], + "geometry": { + "has_geom_detail": false, + "version": 2, + "geom": "{\"coordinates\": [590636.5052221533, 5748250.299347391], \"type\": \"Point\"}" + }, + "available_langs": ["es", "fr"], + "aid_rating": null, + "risk_rating": null, + "areas": [ + { + "type": "a", + "available_langs": null, + "document_id": 14274, + "version": 11, + "locales": [ + { "version": 3, "title": "Fran\u00e7a", "lang": "ca" }, + { "version": 1, "title": "Frankreich", "lang": "de" }, + { "version": 1, "title": "France", "lang": "en" }, + { "version": 1, "title": "Francia", "lang": "es" }, + { "version": 2, "title": "France", "lang": "eu" }, + { "version": 5, "title": "France", "lang": "fr" }, + { "version": 1, "title": "Francia", "lang": "it" } + ], + "area_type": "country", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 14328, + "version": 4, + "locales": [ + { "version": 5, "title": "Is\u00e8re", "lang": "fr" }, + { "version": 1, "title": "Is\u00e8ra", "lang": "ca" }, + { "version": 1, "title": "Is\u00e8re", "lang": "de" }, + { "version": 1, "title": "Is\u00e8re", "lang": "en" }, + { "version": 1, "title": "Is\u00e8re", "lang": "es" }, + { "version": 1, "title": "Is\u00e8re", "lang": "eu" }, + { "version": 1, "title": "Is\u00e8re", "lang": "it" } + ], + "area_type": "admin_limits", + "protected": false + } + ], + "exposition_rock_rating": null, + "height_diff_down": null, + "elevation_min": 215, + "elevation_max": null, + "engagement_rating": "I", + "locales": [ + { + "lang": "es", + "title_prefix": "Hi\u00e8res-sur-Amby", + "title": "indivually tested L2", + "version": 2, + "summary": null + }, + { + "lang": "fr", + "title_prefix": "Hi\u00e8res-sur-Amby", + "title": "Indivually tested L2", + "version": 1, + "summary": null + } + ], + "protected": false, + "rock_required_rating": null, + "rock_free_rating": null, + "type": "r", + "height_diff_difficulties": null, + "height_diff_up": null, + "global_rating": null, + "quality": "draft" + }, + { + "orientations": ["SE"], + "document_id": 1027360, + "equipment_rating": "P1", + "version": 5, + "activities": ["rock_climbing"], + "geometry": { + "has_geom_detail": false, + "version": 5, + "geom": "{\"coordinates\": [796516.5601087556, 5498398.889571204], \"type\": \"Point\"}" + }, + "available_langs": ["fr", "es"], + "aid_rating": null, + "risk_rating": "X1", + "areas": [ + { + "type": "a", + "document_id": 14270, + "available_langs": null, + "protected": false, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country" + }, + { + "type": "a", + "document_id": 14466, + "available_langs": null, + "protected": false, + "version": 1, + "locales": [ + { "version": 7, "title": "Mercantour - Argentera", "lang": "fr" } + ], + "area_type": "range" + }, + { + "type": "a", + "document_id": 280000, + "available_langs": null, + "protected": false, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Prov\u00edncia de Cuneo", + "lang": "ca" + }, + { "version": 1, "title": "Provinz Cuneo", "lang": "de" }, + { "version": 1, "title": "Province of Cuneo", "lang": "en" }, + { "version": 1, "title": "Provincia de Cuneo", "lang": "es" }, + { "version": 1, "title": "Cuneoko probintzia", "lang": "eu" }, + { "version": 1, "title": "Province de Coni", "lang": "fr" }, + { "version": 1, "title": "Provincia di Cuneo", "lang": "it" } + ], + "area_type": "admin_limits" + } + ], + "quality": "great", + "height_diff_down": null, + "elevation_min": null, + "elevation_max": null, + "engagement_rating": "I", + "locales": [ + { + "lang": "fr", + "version": 8, + "summary": "Tr\u00e8s jolie voie bien \u00e9quip\u00e9e en excellent rocher", + "title": "Testa dell'Orgials : Due Milioni", + "title_prefix": "Cima d'Orgials" + }, + { + "lang": "es", + "version": 3, + "summary": null, + "title": "teste dell orgials - due millioni", + "title_prefix": "Cima d'Orgials" + } + ], + "protected": false, + "rock_required_rating": "5b", + "rock_free_rating": "6a", + "height_diff_up": null, + "exposition_rock_rating": "E1", + "height_diff_difficulties": 240, + "type": "r", + "global_rating": "D" + }, + { + "orientations": ["SW"], + "document_id": 57605, + "equipment_rating": "P2", + "version": 4, + "activities": ["rock_climbing"], + "geometry": { + "has_geom_detail": false, + "version": 4, + "geom": "{\"coordinates\": [794926.6951412449, 5501965.498847357], \"type\": \"Point\"}" + }, + "available_langs": ["es", "fr"], + "aid_rating": null, + "risk_rating": null, + "areas": [ + { + "type": "a", + "document_id": 14270, + "available_langs": null, + "protected": false, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country" + }, + { + "type": "a", + "document_id": 14466, + "available_langs": null, + "protected": false, + "version": 1, + "locales": [ + { "version": 7, "title": "Mercantour - Argentera", "lang": "fr" } + ], + "area_type": "range" + }, + { + "type": "a", + "document_id": 280000, + "available_langs": null, + "protected": false, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Prov\u00edncia de Cuneo", + "lang": "ca" + }, + { "version": 1, "title": "Provinz Cuneo", "lang": "de" }, + { "version": 1, "title": "Province of Cuneo", "lang": "en" }, + { "version": 1, "title": "Provincia de Cuneo", "lang": "es" }, + { "version": 1, "title": "Cuneoko probintzia", "lang": "eu" }, + { "version": 1, "title": "Province de Coni", "lang": "fr" }, + { "version": 1, "title": "Provincia di Cuneo", "lang": "it" } + ], + "area_type": "admin_limits" + } + ], + "quality": "medium", + "height_diff_down": 529, + "elevation_min": 2210, + "elevation_max": 2739, + "engagement_rating": "II", + "locales": [ + { + "lang": "es", + "version": 8, + "summary": null, + "title": "Espol\u00f3n SW", + "title_prefix": "Testa Gias dei Laghi" + }, + { + "lang": "fr", + "version": 13, + "summary": null, + "title": "\u00c9peron SW", + "title_prefix": "Testa Gias dei Laghi" + } + ], + "protected": false, + "rock_required_rating": "4c", + "rock_free_rating": "4c", + "height_diff_up": 529, + "exposition_rock_rating": null, + "height_diff_difficulties": 250, + "type": "r", + "global_rating": "D-" + }, + { + "orientations": ["SW"], + "document_id": 805174, + "equipment_rating": "P1+", + "version": 1, + "activities": ["rock_climbing"], + "geometry": { + "has_geom_detail": false, + "version": 1, + "geom": "{\"coordinates\": [794926.6951412449, 5501965.498847357], \"type\": \"Point\"}" + }, + "available_langs": ["es", "fr"], + "aid_rating": null, + "risk_rating": null, + "areas": [ + { + "type": "a", + "available_langs": null, + "document_id": 14270, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 14466, + "version": 1, + "locales": [ + { "version": 7, "title": "Mercantour - Argentera", "lang": "fr" } + ], + "area_type": "range", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 280000, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Prov\u00edncia de Cuneo", + "lang": "ca" + }, + { "version": 1, "title": "Provinz Cuneo", "lang": "de" }, + { "version": 1, "title": "Province of Cuneo", "lang": "en" }, + { "version": 1, "title": "Provincia de Cuneo", "lang": "es" }, + { "version": 1, "title": "Cuneoko probintzia", "lang": "eu" }, + { "version": 1, "title": "Province de Coni", "lang": "fr" }, + { "version": 1, "title": "Provincia di Cuneo", "lang": "it" } + ], + "area_type": "admin_limits", + "protected": false + } + ], + "exposition_rock_rating": null, + "height_diff_down": null, + "elevation_min": 2210, + "elevation_max": 2620, + "engagement_rating": "II", + "locales": [ + { + "lang": "es", + "title_prefix": "Testa Gias dei Laghi", + "title": "Cinquantini Smarmittati", + "version": 4, + "summary": null + }, + { + "lang": "fr", + "title_prefix": "Testa Gias dei Laghi", + "title": "Cinquantini Smarmittati", + "version": 2, + "summary": null + } + ], + "protected": false, + "rock_required_rating": "6a", + "rock_free_rating": "6b", + "type": "r", + "height_diff_difficulties": 280, + "height_diff_up": 500, + "global_rating": "TD", + "quality": "medium" + } + ] + }, + "waypoints": { + "total": 54, + "documents": [ + { + "waypoint_type": "summit", + "elevation": 3060, + "document_id": 37667, + "type": "w", + "areas": [ + { + "type": "a", + "document_id": 14067, + "available_langs": null, + "protected": false, + "version": 10, + "locales": [ + { "version": 1, "title": "Su\u00efssa", "lang": "ca" }, + { "version": 2, "title": "Schweiz", "lang": "de" }, + { "version": 1, "title": "Switzerland", "lang": "en" }, + { "version": 1, "title": "Suiza", "lang": "es" }, + { "version": 1, "title": "Suitza", "lang": "eu" }, + { "version": 1, "title": "Suisse", "lang": "fr" }, + { "version": 1, "title": "Svizzera", "lang": "it" } + ], + "area_type": "country" + }, + { + "type": "a", + "document_id": 14384, + "available_langs": null, + "protected": false, + "version": 9, + "locales": [ + { "version": 12, "title": "Valais", "lang": "fr" }, + { "version": 1, "title": "Valais", "lang": "ca" }, + { "version": 1, "title": "Wallis", "lang": "de" }, + { "version": 1, "title": "Valais", "lang": "en" }, + { "version": 1, "title": "Valais", "lang": "es" }, + { "version": 1, "title": "Valais", "lang": "eu" }, + { "version": 1, "title": "Vallese", "lang": "it" } + ], + "area_type": "admin_limits" + }, + { + "type": "a", + "document_id": 14437, + "available_langs": null, + "protected": false, + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "area_type": "range" + }, + { + "type": "a", + "document_id": 280072, + "available_langs": null, + "protected": false, + "version": 1, + "locales": [ + { "version": 4, "title": "Vall\u00e9e d'Aoste", "lang": "fr" }, + { "version": 1, "title": "Vall d'Aosta", "lang": "ca" }, + { "version": 1, "title": "Aostatal", "lang": "de" }, + { "version": 1, "title": "Aosta Valley", "lang": "en" }, + { "version": 1, "title": "Valle de Aosta", "lang": "es" }, + { "version": 1, "title": "Aostako Harana", "lang": "eu" }, + { "version": 1, "title": "Valle d'Aosta", "lang": "it" } + ], + "area_type": "admin_limits" + } + ], + "available_langs": ["fr", "it"], + "protected": false, + "version": 2, + "locales": [ + { + "version": 3, + "summary": null, + "title": "Pointe de Moline", + "lang": "fr" + }, + { + "version": 1, + "summary": null, + "title": "Testa Grisa", + "lang": "it" + } + ], + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [804653.5696077805, 5763055.32487716], \"type\": \"Point\"}" + }, + "quality": "medium" + }, + { + "waypoint_type": "summit", + "elevation": 2367, + "document_id": 484486, + "type": "w", + "areas": [ + { + "type": "a", + "document_id": 14270, + "available_langs": null, + "protected": false, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country" + }, + { + "type": "a", + "document_id": 14427, + "available_langs": null, + "protected": false, + "version": 8, + "locales": [ + { "version": 5, "title": "Grand Paradis", "lang": "fr" }, + { "version": 1, "title": "Gran Paradiso", "lang": "ca" }, + { "version": 1, "title": "Gran Paradiso", "lang": "de" }, + { "version": 1, "title": "Gran Paradiso", "lang": "en" }, + { "version": 1, "title": "Gran Paradiso", "lang": "es" }, + { "version": 1, "title": "Gran Paradiso", "lang": "eu" }, + { "version": 1, "title": "Gran Paradiso", "lang": "it" } + ], + "area_type": "range" + }, + { + "type": "a", + "document_id": 280072, + "available_langs": null, + "protected": false, + "version": 1, + "locales": [ + { "version": 4, "title": "Vall\u00e9e d'Aoste", "lang": "fr" }, + { "version": 1, "title": "Vall d'Aosta", "lang": "ca" }, + { "version": 1, "title": "Aostatal", "lang": "de" }, + { "version": 1, "title": "Aosta Valley", "lang": "en" }, + { "version": 1, "title": "Valle de Aosta", "lang": "es" }, + { "version": 1, "title": "Aostako Harana", "lang": "eu" }, + { "version": 1, "title": "Valle d'Aosta", "lang": "it" } + ], + "area_type": "admin_limits" + } + ], + "available_langs": ["fr", "it"], + "protected": false, + "version": 2, + "locales": [ + { + "version": 1, + "summary": null, + "title": "T\u00eate des Goilles", + "lang": "fr" + }, + { + "version": 1, + "summary": null, + "title": "Testa Goilles", + "lang": "it" + } + ], + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [827245.1923473306, 5714515.883330288], \"type\": \"Point\"}" + }, + "quality": "medium" + }, + { + "quality": "fine", + "elevation": 3251, + "document_id": 754380, + "areas": [ + { + "type": "a", + "available_langs": null, + "document_id": 14270, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 14424, + "version": 3, + "locales": [ + { + "version": 1, + "title": "Grajische Alpen - Charbonnel", + "lang": "de" + }, + { + "version": 1, + "title": "Graian Alps - Charbonnel", + "lang": "en" + }, + { + "version": 1, + "title": "Alpes Grayos - Charbonnel", + "lang": "es" + }, + { + "version": 5, + "title": "Alpes Gr\u00e9es - Charbonnel", + "lang": "fr" + }, + { "version": 1, "title": "Alpi Graie - Charbonnel", "lang": "it" } + ], + "area_type": "range", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 280066, + "version": 3, + "locales": [ + { + "version": 1, + "title": "Prov\u00edncia de Tor\u00ed", + "lang": "ca" + }, + { "version": 1, "title": "Provinz Turin", "lang": "de" }, + { "version": 1, "title": "Province of Turin", "lang": "en" }, + { + "version": 1, + "title": "Provincia de Tur\u00edn", + "lang": "es" + }, + { "version": 1, "title": "Turingo probintzia", "lang": "eu" }, + { "version": 1, "title": "Province de Turin", "lang": "fr" }, + { "version": 1, "title": "Provincia di Torino", "lang": "it" } + ], + "area_type": "admin_limits", + "protected": false + } + ], + "waypoint_type": "summit", + "available_langs": ["fr", "it"], + "type": "w", + "version": 2, + "locales": [ + { + "lang": "fr", + "title": "Testa Sula", + "version": 4, + "summary": null + }, + { + "lang": "it", + "title": "Testa Sul\u00e0", + "version": 1, + "summary": null + } + ], + "geometry": { + "version": 1, + "geom": "{\"coordinates\": [794300.1890470616, 5659373.131308164], \"type\": \"Point\"}" + }, + "protected": false + }, + { + "quality": "medium", + "elevation": 1998, + "document_id": 246724, + "areas": [ + { + "type": "a", + "available_langs": null, + "document_id": 14270, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 14444, + "version": 3, + "locales": [ + { "version": 2, "title": "Dolomites occidentales", "lang": "fr" }, + { "version": 1, "title": "Dolomiti occidentale", "lang": "it" } + ], + "area_type": "range", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 280068, + "version": 1, + "locales": [ + { + "version": 1, + "title": "Prov\u00edncia de Trento", + "lang": "ca" + }, + { "version": 1, "title": "Trentino", "lang": "de" }, + { "version": 1, "title": "Trentino", "lang": "en" }, + { + "version": 1, + "title": "Provincia aut\u00f3noma de Trento", + "lang": "es" + }, + { + "version": 1, + "title": "Trentoko probintzia autonomoa", + "lang": "eu" + }, + { + "version": 1, + "title": "Province autonome de Trente", + "lang": "fr" + }, + { + "version": 1, + "title": "Provincia autonoma di Trento", + "lang": "it" + } + ], + "area_type": "admin_limits", + "protected": false + } + ], + "waypoint_type": "summit", + "available_langs": ["it"], + "type": "w", + "version": 2, + "locales": [ + { + "lang": "it", + "title": "Monte Testo", + "version": 1, + "summary": null + } + ], + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [1239970.9987031643, 5751337.945000094], \"type\": \"Point\"}" + }, + "protected": false + }, + { + "waypoint_type": "summit", + "elevation": 2533, + "document_id": 41098, + "type": "w", + "areas": [ + { + "type": "a", + "document_id": 14270, + "available_langs": null, + "protected": false, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country" + }, + { + "type": "a", + "document_id": 14437, + "available_langs": null, + "protected": false, + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "area_type": "range" + }, + { + "type": "a", + "document_id": 280072, + "available_langs": null, + "protected": false, + "version": 1, + "locales": [ + { "version": 4, "title": "Vall\u00e9e d'Aoste", "lang": "fr" }, + { "version": 1, "title": "Vall d'Aosta", "lang": "ca" }, + { "version": 1, "title": "Aostatal", "lang": "de" }, + { "version": 1, "title": "Aosta Valley", "lang": "en" }, + { "version": 1, "title": "Valle de Aosta", "lang": "es" }, + { "version": 1, "title": "Aostako Harana", "lang": "eu" }, + { "version": 1, "title": "Valle d'Aosta", "lang": "it" } + ], + "area_type": "admin_limits" + } + ], + "available_langs": ["fr", "it"], + "protected": false, + "version": 2, + "locales": [ + { + "version": 3, + "summary": null, + "title": "T\u00eate Bernarde", + "lang": "fr" + }, + { + "version": 1, + "summary": null, + "title": "Testa Bernarda", + "lang": "it" + } + ], + "geometry": { + "version": 2, + "geom": "{\"coordinates\": [780782.5519605434, 5752393.969662178], \"type\": \"Point\"}" + }, + "quality": "medium" + }, + { + "quality": "medium", + "elevation": 2785, + "document_id": 43368, + "areas": [ + { + "type": "a", + "available_langs": null, + "document_id": 14270, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 14437, + "version": 6, + "locales": [ + { + "version": 7, + "title": "Valais W - Alpes Pennines W", + "lang": "fr" + }, + { + "version": 1, + "title": "Walliser Alpen W - Penninische Alpen W", + "lang": "de" + }, + { + "version": 1, + "title": "Valais W - Pennine Alps W", + "lang": "en" + }, + { + "version": 2, + "title": "Alpi Pennine Occidentali", + "lang": "it" + } + ], + "area_type": "range", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 280072, + "version": 1, + "locales": [ + { "version": 4, "title": "Vall\u00e9e d'Aoste", "lang": "fr" }, + { "version": 1, "title": "Vall d'Aosta", "lang": "ca" }, + { "version": 1, "title": "Aostatal", "lang": "de" }, + { "version": 1, "title": "Aosta Valley", "lang": "en" }, + { "version": 1, "title": "Valle de Aosta", "lang": "es" }, + { "version": 1, "title": "Aostako Harana", "lang": "eu" }, + { "version": 1, "title": "Valle d'Aosta", "lang": "it" } + ], + "area_type": "admin_limits", + "protected": false + } + ], + "waypoint_type": "summit", + "available_langs": ["fr", "it"], + "type": "w", + "version": 3, + "locales": [ + { + "lang": "fr", + "title": "T\u00eate Noire - Planaval", + "version": 8, + "summary": null + }, + { "lang": "it", "title": "Testa Nera", "version": 1, "summary": null } + ], + "geometry": { + "version": 3, + "geom": "{\"coordinates\": [786966.906271564, 5748179.404999532], \"type\": \"Point\"}" + }, + "protected": false + }, + { + "quality": "great", + "elevation": 2688, + "document_id": 544641, + "areas": [ + { + "type": "a", + "available_langs": null, + "document_id": 14270, + "version": 9, + "locales": [ + { "version": 1, "title": "It\u00e0lia", "lang": "ca" }, + { "version": 1, "title": "Italien", "lang": "de" }, + { "version": 1, "title": "Italy", "lang": "en" }, + { "version": 1, "title": "Italia", "lang": "es" }, + { "version": 1, "title": "Italia", "lang": "eu" }, + { "version": 2, "title": "Italie", "lang": "fr" }, + { "version": 2, "title": "Italia", "lang": "it" } + ], + "area_type": "country", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 14424, + "version": 3, + "locales": [ + { + "version": 1, + "title": "Grajische Alpen - Charbonnel", + "lang": "de" + }, + { + "version": 1, + "title": "Graian Alps - Charbonnel", + "lang": "en" + }, + { + "version": 1, + "title": "Alpes Grayos - Charbonnel", + "lang": "es" + }, + { + "version": 5, + "title": "Alpes Gr\u00e9es - Charbonnel", + "lang": "fr" + }, + { "version": 1, "title": "Alpi Graie - Charbonnel", "lang": "it" } + ], + "area_type": "range", + "protected": false + }, + { + "type": "a", + "available_langs": null, + "document_id": 280072, + "version": 1, + "locales": [ + { "version": 4, "title": "Vall\u00e9e d'Aoste", "lang": "fr" }, + { "version": 1, "title": "Vall d'Aosta", "lang": "ca" }, + { "version": 1, "title": "Aostatal", "lang": "de" }, + { "version": 1, "title": "Aosta Valley", "lang": "en" }, + { "version": 1, "title": "Valle de Aosta", "lang": "es" }, + { "version": 1, "title": "Aostako Harana", "lang": "eu" }, + { "version": 1, "title": "Valle d'Aosta", "lang": "it" } + ], + "area_type": "admin_limits", + "protected": false + } + ], + "waypoint_type": "hut", + "available_langs": ["fr", "it"], + "type": "w", + "version": 5, + "locales": [ + { + "lang": "fr", + "title": "Bivouac Testafochi", + "version": 6, + "summary": null + }, + { + "lang": "it", + "title": "Ricovero Testafochi", + "version": 1, + "summary": null + } + ], + "geometry": { + "version": 4, + "geom": "{\"coordinates\": [788553.2090153673, 5718914.5989728905], \"type\": \"Point\"}" + }, + "protected": false + } + ] + } +} +--- +[ + { + "id": "787783", + "title": "Testa del Vallonetto : Occhi Blu", + "summary": null, + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "363730", + "title": "Testa del Vallonetto : Luna", + "summary": "Voie sur bon rocher, majoritairement dalle.", + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "805196", + "title": "Testa Gias dei Laghi : Eroi Di Cartone", + "summary": null, + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "895869", + "title": "Hières-sur-Amby : Indivually tested L2", + "summary": null, + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "1027360", + "title": "Cima d'Orgials : Testa dell'Orgials : Due Milioni", + "summary": "Très jolie voie bien équipée en excellent rocher", + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "57605", + "title": "Testa Gias dei Laghi : Éperon SW", + "summary": null, + "activities": [ + "ROCK_CLIMBING" + ] + }, + { + "id": "805174", + "title": "Testa Gias dei Laghi : Cinquantini Smarmittati", + "summary": null, + "activities": [ + "ROCK_CLIMBING" + ] + } +]