Matching HERE 使用 REST API 将项目与维基百科内容进行映射

问题描述 投票:0回答:1

使用 HERE Maps REST api 的 V7 版本,我试图匹配从

/browse
/discover
端点获取的数据,并将它们与从游客的 Wikimedia Action API 获取的数据明确匹配指南应用程序。

例如,通过调用以下端点:

curl "https://discover.search.hereapi.com/v1/browse?in=circle%3A45.4627338,9.1777323%3Br%3D300&limit=30&apiKey={API KEY REDACTED}&categories=300-3000-0025&at=45.4627338,9.1777323&lang=en-US" \
     -H 'Accept: application/json' \
     -H 'Accept-Encoding: gzip'

我们得到米兰中心周围兴趣点的 JSON 格式数组,这是其中的一个元素:

{
  "title":"Basilica di Sant'Ambrogio",
  "id":"here:pds:place:380u0nd8-2d259709e0aa42908182e1a03a8d9aca",
  "language":"en",
  "resultType":"place",
  "address":{
    "label":"Basilica di Sant'Ambrogio, Piazza Sant'Ambrogio, 15, 20123 Milan MI, Italy",
    "countryCode":"ITA",
    "countryName":"Italy",
    "state":"Lombardy",
    "countyCode":"MI",
    "county":"Milan",
    "city":"Milan",
    "district":"Duomo",
    "street":"Piazza Sant'Ambrogio",
    "postalCode":"20123",
    "houseNumber":"15"
  },
  "position":{
    "lat":45.4624,
    "lng":9.1757
  },
  "access":[
    {
      "lat":45.46219,
      "lng":9.17481
    }
  ],
  "distance":163,
  "categories":[
    {
      "id":"300-3200-0030",
      "name":"Church",
      "primary":true
    },
    {
      "id":"300-3000-0023",
      "name":"Tourist Attraction"
    },
    {
      "id":"300-3000-0025",
      "name":"Historical Monument"
    },
    {
      "id":"300-3100-0028",
      "name":"History Museum"
    },
    {
      "id":"300-3100-0029",
      "name":"Art Museum"
    },
    {
      "id":"900-9300-0221",
      "name":"Residential Area\/Building"
    }
  ],
  "references":[
    {
      "supplier":{
        "id":"core"
      },
      "id":"1175957532"
    },
    {
      "supplier":{
        "id":"core"
      },
      "id":"1175957749"
    },
    {
      "supplier":{
        "id":"core"
      },
      "id":"50930489"
    },
    {
      "supplier":{
        "id":"core"
      },
      "id":"800801056"
    },
    {
      "supplier":{
        "id":"tripadvisor"
      },
      "id":"591187"
    },
    {
      "supplier":{
        "id":"yelp"
      },
      "id":"QIqHOCwwIy1kFTPiPIeGnQ"
    }
  ],
  "contacts":[
    {
      "phone":[
        {
          "value":"+39028057310"
        },
        {
          "value":"+390286450895",
          "categories":[
            {
              "id":"300-3100-0028"
            },
            {
              "id":"300-3200-0030"
            }
          ]
        }
      ],
      "www":[
        {
          "value":"http:\/\/www.basilicasantambrogio.it",
          "categories":[
            {
              "id":"300-3100-0028"
            },
            {
              "id":"300-3200-0030"
            }
          ]
        }
      ]
    }
  ]
}

我可以看到 HERE 地图返回一系列与 Tripadvisor 和 Yelp 匹配的实体 ID,但没有任何内容明确指向维基百科。

似乎可以使用 show_content 参数在 API 的

已弃用版本
上获取此信息,但我找不到与当前可用版本等效的内容。

有人能够在两个系统之间进行翻译吗?我想我可以采用不太精确的方法,并在纬度、经度和地名之间进行粗略匹配,但这感觉太“hacky”,我宁愿避免对每个位置向维基百科发出多个查询请求。

有人遇到过类似的事情吗?我觉得我错过了一些明显的东西,但我不知道我实际上应该使用哪些参数。

rest here-api wikipedia-api heremaps
1个回答
0
投票

首先,您需要使用正常的措辞(例如城市名称等)查询维基百科。并对其进行优化,直到您知道结果页面很可能是您每次需要的页面。 然后维基百科 API 会返回给你一大堆难以使用的数组,但有一个键值,即每个维基百科页面的 ID。它隐藏在一个巨大的数组中,这决定了您是否获得正确的页面。

很抱歉代码非常粗糙,但这是非常古老的并且维基百科 API 非常复杂。我希望它可以作为一个例子。 您可以想象缺失的值是什么,它应该为您提供一个起点。 这里我提取一篇文章的标题和页面 ID,然后通过名称、简短描述使用正常查询来提取文章的内容。因此,我有效地使用了 2 个不同的维基百科 API,并向它们提供我从 HERE API 获得的数据。因此,您可以将这两个函数视为单独的示例。

 //wikipedia title
  wikiQueryBaseUrl="https://en.wikipedia.org/w/api.php?format=json&origin=*&action=query&titles=";
  if(typeof city !== 'undefined'){
  wikiQueryUrl=wikiQueryBaseUrl+city;}
  else{wikiQueryUrl=wikiQueryBaseUrl+inputValue};
  fetch(wikiQueryUrl) 
  .then((response) => response.json()) 
  .then((data) => {
  preWikiData = data;
  pageId = Object.keys(preWikiData.query.pages)[0];
  if(preWikiData.query.pages[pageId] !== 'undefined'){
  wikiLink="http://en.wikipedia.org/?curid="+pageId}
  if(pageId == '-1'){
    wikiLink="https://en.wikipedia.org/";
  };

  //wikipedia data
  wikiQueryBaseUrl="https://en.wikipedia.org/w/api.php?format=json&origin=*&action=query&prop=extracts&exintro&explaintext=true&titles=";
  wikiQueryUrl=wikiQueryBaseUrl+country.replace(' ', '')+"&redirects=1";
  fetch(wikiQueryUrl) 
  .then((response) => response.json()) 
  .then((data) => {
  preWikiData = data;
  pageId = Object.keys(preWikiData.query.pages)[0];
  if(typeof preWikiData.query.pages[pageId].title !== 'undefined'){
  wikiData=preWikiData.query.pages[pageId].extract;}
  }); 
© www.soinside.com 2019 - 2024. All rights reserved.