Заказ элементов легенды карты в службе запросов Wikidata - PullRequest
0 голосов
/ 24 апреля 2018

Wikidata предоставляет классный способ для отображения результатов SPARQL на OpenStreetMap. Для пример :

#Big cities, grouped into map layers by population
#defaultView:Map
SELECT DISTINCT ?city ?cityLabel (SAMPLE(?location) AS ?location) (MAX(?population) AS ?population) (SAMPLE(?layer) AS ?layer)
WHERE
{
  ?city wdt:P31/wdt:P279* wd:Q515;
        wdt:P625 ?location;
        wdt:P1082 ?population.
  FILTER(?population >= 500000).
  BIND(
    IF(?population < 1000000, "<1M",
    IF(?population < 2000000, "1M-2M",
    IF(?population < 5000000, "2M-5M",
    IF(?population < 10000000, "5M-10M",
    IF(?population < 20000000, "10M-20M",
    ">20M")))))
    AS ?layer).
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
GROUP BY ?city ?cityLabel

Мне интересно, есть ли способ контролировать порядок элементов в легенде (вверху справа).

1 Ответ

0 голосов
/ 24 апреля 2018

Кажется, что пытается проанализировать имена слоев как числа.В случае сбоя порядок слоев в легенде соответствует порядку первого появления в таблице (переключение между представлениями «Карта» и «Таблица»).

Таким образом, вам следует связать дополнительную переменную сестественно сортируемые значения (а затем сортировать результаты по этим значениям).Возможно, это возможно при использовании REPLACE, но я бы предпочел использовать простой словарь.

#--Big cities, grouped into map layers by population--
#defaultView:Map
SELECT DISTINCT ?city ?cityLabel
(SAMPLE(?location) AS ?location) (MAX(?population) AS ?population)
(SAMPLE(?layer) AS ?layer) {
    VALUES (?layer ?order) {
    ("<1M" 1) ("1M-2M" 2) ("2M-5M" 3) ("5M-10M" 4) ("10M-20M" 5) (">20M" 6)}
    ?city wdt:P31/wdt:P279* wd:Q515;
          wdt:P625 ?location;
          wdt:P1082 ?population.
    FILTER(?population >= 500000).
    BIND(
    IF(?population < 1000000, "<1M",
    IF(?population < 2000000, "1M-2M",
    IF(?population < 5000000, "2M-5M",
    IF(?population < 10000000, "5M-10M",
    IF(?population < 20000000, "10M-20M",
    ">20M")))))
    AS ?layer).
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} GROUP BY ?city ?cityLabel ORDER BY (SAMPLE(?order))

Попробуйте!

...