谷歌地图API适用于C#

22

我对使用API非常新手,所以在查看Google Maps API页面后,我不确定是否有设计用于C#的API。 我不需要在我的应用程序上显示Google地图;我只需要知道是否可以在C#上使用Google Maps API。这是我想要使用的API

我已经在许多地方寻找过它,但我找到的都是使用Gmaps的替代方法,这不是我想要的。

它可行吗?


2
欢迎来到StackOverflow!我们希望在问题和答案中能够包含实际的代码。这个问题如果保持现状很可能会被关闭,但请不要因此而放弃提问其他问题。 - Marijn
@Marijn 那是一个 Stack Overflow 的指南吗?如果是,你能提供一个链接吗? - Alex P.
嗯,我认为这不是一个好问题,但考虑到社区的十二个赞同票,大家似乎有不同看法。我会投票将其关闭,因为它太广泛了(现在称为“需要更多关注”)。"需要更多关注- 这个问题目前包含了多个问题。它应该只关注一个问题。" - Marijn
3个回答

20

1. 自己创建请求到 Google Maps API

您可以直接向Google Maps API发送HTTP请求,然后使用结果。您可以使用WebRequest模拟向Google API发送请求。为此,您需要一个Maps API密钥


您需要构建GET参数,例如origin = ...&destination = ...&key = YOUR_API_KEY ,并解析JSON响应以进行处理。

Google Maps API文档(Web服务API下)列出了请求参数和示例响应。

string url = @"https://maps.googleapis.com/maps/api/directions/json?origin=75+9th+Ave+New+York,+NY&destination=MetLife+Stadium+1+MetLife+Stadium+Dr+East+Rutherford,+NJ+07073&key=YOUR_API_KEY";

WebRequest request = WebRequest.Create(url);

WebResponse response = request.GetResponse();

Stream data = response.GetResponseStream();

StreamReader reader = new StreamReader(data);

// json-formatted string from maps api
string responseFromServer = reader.ReadToEnd();

response.Close();

一个JSON响应看起来会像这样(来自Directions API

{
   "geocoded_waypoints" : [
      {
         "geocoder_status" : "OK",
         "place_id" : "ChIJRVY_etDX3IARGYLVpoq7f68",
         "types" : [
            "bus_station",
            "transit_station",
            "point_of_interest",
            "establishment"
         ]
      },
      {
         "geocoder_status" : "OK",
         "partial_match" : true,
         "place_id" : "ChIJp2Mn4E2-woARQS2FILlxUzk",
         "types" : [ "route" ]
      }
   ],
   "routes" : [
      {
         "bounds" : {
            "northeast" : {
               "lat" : 34.1330949,
               "lng" : -117.9143879
            },
            "southwest" : {
               "lat" : 33.8068768,
               "lng" : -118.3527671
            }
         },
         "copyrights" : "Map data ©2016 Google",
         "legs" : [
            {
               "distance" : {
                  "text" : "35.9 mi",
                  "value" : 57824
               },
               "duration" : {
                  "text" : "51 mins",
                  "value" : 3062
               },
               "end_address" : "Universal Studios Blvd, Los Angeles, CA 90068, USA",
               "end_location" : {
                  "lat" : 34.1330949,
                  "lng" : -118.3524442
               },
               "start_address" : "Disneyland (Harbor Blvd.), S Harbor Blvd, Anaheim, CA 92802, USA",
               "start_location" : {
                  "lat" : 33.8098177,
                  "lng" : -117.9154353
               },

  ... Additional results truncated in this example[] ...


         "overview_polyline" : {
            "points" : "knjmEnjunUbKCfEA?_@]@kMBeE@qIIoF@wH@eFFk@WOUI_@?u@j@k@`@EXLTZHh@Y`AgApAaCrCUd@cDpDuAtAoApA{YlZiBdBaIhGkFrDeCtBuFxFmIdJmOjPaChDeBlDiAdD}ApGcDxU}@hEmAxD}[tt@yNb\\yBdEqFnJqB~DeFxMgK~VsMr[uKzVoCxEsEtG}BzCkHhKWh@]t@{AxEcClLkCjLi@`CwBfHaEzJuBdEyEhIaBnCiF|K_Oz\\
            {MdZwAbDaKbUiB|CgCnDkDbEiE|FqBlDsLdXqQra@kX|m@aF|KcHtLm@pAaE~JcTxh@w\\`v@gQv`@}F`MqK`PeGzIyGfJiG~GeLhLgIpIcE~FsDrHcFfLqDzH{CxEwAbBgC|B}F|DiQzKsbBdeA{k@~\\oc@bWoKjGaEzCoEzEwDxFsUh^wJfOySx[uBnCgCbCoFlDmDvAiCr@eRzDuNxC_EvAiFpCaC|AqGpEwHzFoQnQoTrTqBlCyDnGmCfEmDpDyGzGsIzHuZzYwBpBsC`CqBlAsBbAqCxAoBrAqDdDcNfMgHbHiPtReBtCkD|GqAhBwBzBsG~FoAhAaCbDeBvD_BlEyM``@uBvKiA~DmAlCkA|B}@lBcChHoJnXcB`GoAnIS~CIjFDd]A|QMlD{@jH[vAk@`CoGxRgPzf@aBbHoB~HeMx^eDtJ}BnG{DhJU`@mBzCoCjDaAx@mAnAgCnBmAp@uAj@{Cr@wBPkB@kBSsEW{GV}BEeCWyAWwHs@qH?
            cIHkDXuDn@mCt@mE`BsH|CyAp@}AdAaAtAy@lBg@pCa@jE]fEcBhRq@pJKlCk@hLFrB@lD_@xCeA`DoBxDaHvM_FzImDzFeCpDeC|CkExDiJrHcBtAkDpDwObVuCpFeCdHoIl\\uBjIuClJsEvMyDbMqAhEoDlJ{C|J}FlZuBfLyDlXwB~QkArG_AnDiAxC{G|OgEdLaE`LkBbEwG~KgHnLoEjGgDxCaC`BuJdFkFtCgCnBuClD_HdMqEzHcBpB_C|BuEzCmPlIuE|B_EtDeBhCgAdCw@rCi@|DSfECrCAdCS~Di@jDYhA_AlC{AxCcL`U{GvM_DjFkBzBsB`BqDhBaEfAsTvEmEr@iCr@qDrAiFnCcEzCaE~D_@JmFdGQDwBvCeErEoD|BcFjC}DbEuD~D`@Zr@h@?d@Wr@}@vAgCbEaHfMqA`Cy@dAg@bAO`@gCi@w@W"
         },
         "summary" : "I-5 N and US-101 N",
         "warnings" : [],
         "waypoint_order" : []
      }
   ],
   "status" : "OK"
}

2. …或使用专用库

  • gmaps-api-net (github)提供了Google Maps的API接口。你可以通过NuGet获取它。我没有测试过,但它看起来非常容易使用。

这个库已经过时了,请参见https://dev59.com/01sW5IYBdhLWcg3wyJl3#61531795


1
请返回英文 WebRequest 页面的链接:https://msdn.microsoft.com/zh-cn/library/debx8sh9(v=vs.110).aspx - Illuminator
为什么要使用“YOUR_API_KEY”?它不再免费提供了吗? - user6159419
1
@user6159419 免费使用次数有限制。您可以查看谷歌自己的文档 - maiorano84
还有这个库非常简单易用,具有最受欢迎的功能。https://github.com/guimsilva/GuigleCore 您可以使用nuget命令Install-Package GuigleCore进行安装。 - Guilherme
如果URL中有路标,那么它会包含这些信息吗? - Arie

7

如其他回答所述,您可以发起HTTP请求并使用JSON响应。

如果您想要一个.NET库来抽象查询/响应以使您的生活更轻松,您可以使用这些Google Maps API的.NET包装库之一:

  1. GoogleApi
  2. google-maps

gmaps-api-net已过时(在回答时)- Directions API的最后更新是在2016年进行的。

GoogleApi的用法示例:

using GoogleApi.Entities.Common;
using GoogleApi.Entities.Maps.Directions.Request;
using GoogleApi.Entities.Maps.Directions.Response;

public void GetRoute()
{
    DirectionsRequest request = new DirectionsRequest();    

    request.Key = "AIzaSyAJgBs8LYok3rt15rZUg4aUxYIAYyFzNcw";

    request.Origin = new Location("Brasov");
    request.Destination = new Location("Merghindeal");

    var response = GoogleApi.GoogleMaps.Directions.Query(request);

    Console.WriteLine(response.Routes.First().Legs.First().DurationInTraffic);
    Console.WriteLine(response.Routes.First().Legs.First().Distance);
    Console.WriteLine(response.Routes.First().Legs.First().Steps);
}

1
这是一个非常有用的答案。我们是否有一个链接,可以向我解释GoogleApi可以执行哪些各种任务以及如何执行它们?你看,Readme文档真的不是很详细,这肯定会解决我的问题。 - kesarling He-Him

1

补充Alex的答案。

在他们的例子中,他们首先尝试编写DurationInTraffic,但只有在提供departureTime时才有效。此外,您需要显示秒数或文本的值而不是对象。您也可以使用不带交通选择的持续时间。

如果确实想设置出发时间,该项目将自动为您设置自1970年以来的时代/ Linux / 秒。然而,我没有看到像Google那样的“现在”选项,所以一定要先将其设置为UTC。

如果您没有提供departureTimeDurationInTraffic将为空,因此会出现错误。

request.DepartureTime = DateTime.Now.ToUniversalTime();

...

var x = response.Routes.First().Legs.First();
                Console.WriteLine("Duration w/ traffic: " + x.DurationInTraffic.Value + " vs w/o " + x.Duration.Value);
                Console.ReadLine();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接