0

命名空间可以Microsoft.Phone.Maps.Services在 Windows 应用商店应用程序中使用吗?

如果没有,是否有合适的替代方案可用?

我被定向到这个,它显示了一些代码,这些代码正是非医生为了根据诸如地址之类的搜索词获取地理定位数据而订购的。

然而

该片段中使用的类(在Maps_GeoCoding事件和QueryCompleted回调中)来自 Microsoft.Phone.Maps.Services 命名空间,我需要这个或类似的代码用于 Windows 商店应用程序应用程序(我知道“Windows 商店应用程序”命名法会导致一些尴尬)。

有人知道一组类似的功能吗?或者,是否有可能,尽管听起来违反直觉,但实际上可以Microsoft.Phone.Maps.Services在 Windows 应用商店应用程序中使用命名空间?

更新

这就是我所做的(广告 [a,o] 选自 Justin "Teen" Angel 下面的代码,未显示 appId 和 appCode):

private async static Task<string> GetCoordinatesForAddress(string address) // AKA Geocoding (reverse geocoding is getting address for coordinates)
{
    // build URL for Here.net REST service
    string currentgeoLoc = "0.0,0.0";
    string queryString = address; //"Ferry Building, San-Francisco";
    string appID = "<appId>"; // MAKE SURE TO GET YOUR OWN from developers.here.net
    object appCode = "<appCode>"; // MAKE SURE TO GET YOUR OWN from developers.here.net
    var hereNetUrl = string.Format(
        "http://demo.places.nlp.nokia.com/places/v1/discover/search?at={0}&q={1}&app_id={2}&app_code={3}&accept=application/json",
            currentgeoLoc, queryString, appID, appCode);

    // get data from HERE.net REST API
    var httpClient = new HttpClient();
    var hereNetResponse = await httpClient.GetStringAsync(hereNetUrl);

    // deseralize JSON from Here.net 
    using (var tr = new StringReader(hereNetResponse))
    using (var jr = new JsonTextReader(tr))
    {
        var rootObjectResponse = new JsonSerializer().Deserialize<JsonDOTNetHelperClasses.RootObject>(jr);
        var firstplace = rootObjectResponse.results.items.First();
        return string.Format("{0};{1}", firstplace.position[0], firstplace.position[1]);
    }
}
4

2 回答 2

2

WP8 Nokia<Maps />控件及其相关服务(路由、地理编码等)目前在 Win8 SDK 中不可用。Win8 应用程序应使用必应地图 API。

但是,如果您确实想在 Win8 应用程序中使用诺基亚地图功能,那绝对是可能的。Here.net(诺基亚的位置门户)公开了公开记录的 Web API。您可以使用“核心计划”,该计划每天允许来自 here.net REST API 的最多 2,500 个免费查询。这些 REST API 包括地理编码、反向地理编码、行人路线、驾驶路线等。

您可以在@http: //developer.here.net/javascript_api_explorer看到这些 REST API 的示例(单击右上角的“REST API Explorer”,因为此视图默认为 javascript API 浏览器)。地理编码 API 将在“地点”下提供。

例如,以下是在 Win8 上使用 REST API复制WP8 Maps GeoCoding 示例的方法:

private async void GeocodingWin8Query()
{
    // build URL for Here.net REST service
    string currentgeoLoc = "0.0,0.0";
    string queryString = "Ferry Building, San-Francisco";
    string appID = "<appId>"; // MAKE SURE TO GET YOUR OWN from developers.here.net
    object appCode = "<appCode>"; // MAKE SURE TO GET YOUR OWN from developers.here.net
    var hereNetUrl = string.Format(
        "http://demo.places.nlp.nokia.com/places/v1/discover/search?at={0}&q={1}&app_id={2}&app_code={3}&accept=application/json",
            currentgeoLoc, queryString, appID, appCode);

    // get data from HERE.net REST API
    var httpClient = new HttpClient();
    var hereNetResponse = await httpClient.GetStringAsync(hereNetUrl);

    // deseralize JSON from Here.net 
    using (var tr = new StringReader(hereNetResponse))
    using (var jr = new JsonTextReader(tr))
    {
        var rootObjectResponse = new JsonSerializer().Deserialize<RootObject>(jr);

        // print the details of the first geocoding result 
        var firstplace = rootObjectResponse.results.items.First();
        await new MessageDialog("Name: " + firstplace.title + Environment.NewLine +
                          "Geolocation: " + firstplace.position[0] + ", " + firstplace.position[1] + Environment.NewLine +
                          "Address: " + HtmlUtilities.ConvertToText(firstplace.vicinity) + Environment.NewLine +
                          "Type: " + firstplace.type + Environment.NewLine,
                          "Win8 Nokia Maps Geocoding").ShowAsync();
    }
}

当我们运行这个代码片段时,我们可以看到 Win8 可以访问与 WP8 相同的地理编码数据:

来自 REST API 的 Win8 GeoCoding 数据

这个 API 还可以做更多的事情,比如反向地理编码、路由等。正如我提到的,您可以在Here.net REST API上探索这些功能(单击右上角的“REST API 资源管理器”)。另外,登录后不要忘记注册一个 AppID 和 AppCode。

为了使上面的代码正常工作,我使用了 JSON.Net。您需要从 NuGet 安装 JSON.net 并从 json2csharp复制一些强类型生成的类。以下是安装 JSON.net 的方法:

NuGet 安装 Json.net

以下是生成的 C# JSON.net 类:

public class Category
{
    public string id { get; set; }
    public string title { get; set; }
    public string href { get; set; }
    public string type { get; set; }
}

public class Item
{
    public List<double> position { get; set; }
    public int distance { get; set; }
    public string title { get; set; }
    public Category category { get; set; }
    public string icon { get; set; }
    public string vicinity { get; set; }
    public List<object> having { get; set; }
    public string type { get; set; }
    public string href { get; set; }
    public string id { get; set; }
    public double? averageRating { get; set; }
}

public class Results
{
    public List<Item> items { get; set; }
}

public class Location
{
    public List<double> position { get; set; }
}

public class Context
{
    public Location location { get; set; }
    public string type { get; set; }
}

public class Search
{
    public Context context { get; set; }
}

public class RootObject
{
    public Results results { get; set; }
    public Search search { get; set; }
}
于 2012-12-27T05:49:19.307 回答
1

虽然有可能,但我认为它不可靠。

当内置 Maps SDK(在 Bing Maps 上运行)时,为什么要这样做

这是一个我认为你应该看的教程

于 2012-12-27T03:13:34.803 回答