我对使用API非常新手,所以在查看Google Maps API页面后,我不确定是否有设计用于C#的API。 我不需要在我的应用程序上显示Google地图;我只需要知道是否可以在C#上使用Google Maps API。这是我想要使用的API。
我已经在许多地方寻找过它,但我找到的都是使用Gmaps的替代方法,这不是我想要的。
它可行吗?
我对使用API非常新手,所以在查看Google Maps API页面后,我不确定是否有设计用于C#的API。 我不需要在我的应用程序上显示Google地图;我只需要知道是否可以在C#上使用Google Maps API。这是我想要使用的API。
我已经在许多地方寻找过它,但我找到的都是使用Gmaps的替代方法,这不是我想要的。
它可行吗?
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
如其他回答所述,您可以发起HTTP请求并使用JSON响应。
如果您想要一个.NET库来抽象查询/响应以使您的生活更轻松,您可以使用这些Google Maps API的.NET包装库之一:
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);
}
补充Alex的答案。
在他们的例子中,他们首先尝试编写DurationInTraffic
,但只有在提供departureTime
时才有效。此外,您需要显示秒数或文本的值而不是对象。您也可以使用不带交通选择的持续时间。
如果确实想设置出发时间,该项目将自动为您设置自1970年以来的时代/ Linux / 秒。然而,我没有看到像Google那样的“现在”选项,所以一定要先将其设置为UTC。
如果您没有提供departureTime
,DurationInTraffic
将为空,因此会出现错误。
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();