Доброго времени суток! В просторах интернета готовых решений найти не удалось, но тема и сама затея может быть кому-нибудь будет интересной и полезной.
Цель определить расстояние между городами, местами, конкретными адресами и тд Полазив по гуглу, и экспериментируя руками, получилось найти структуру ответа на запрос по расстоянию на карте между пунктами в виде xml
Атрибут distance дает расстояние в метрах.
Распарсить xml я не могу т.к. этот отрезок vba мне дается тяжело
[vba]
Код
Sub DistanceXML() Dim urladr, a, b a = InputBox("Пункт А", "А", "") b = InputBox("Пункт Б", "Б", "") a = Replace(a, " ", "+") a = Replace(a, ",", "+") b = Replace(b, " ", "+") b = Replace(b, ",", "+")
urladr = "https://maps.googleapis.com/maps/api/distancematrix/xml?origins=" & a & "|Seattle&destinations=" & b ' далее мне нужно распарсить код из гугл и получить цифры - дистанцию между пунктом А и Б в метрах distance -> value '<distance> '<value>11797</value>... '</distance>
MsgBox "Расстояние " & distance & " метров :)" End Sub
[/vba]
Доброго времени суток! В просторах интернета готовых решений найти не удалось, но тема и сама затея может быть кому-нибудь будет интересной и полезной.
Цель определить расстояние между городами, местами, конкретными адресами и тд Полазив по гуглу, и экспериментируя руками, получилось найти структуру ответа на запрос по расстоянию на карте между пунктами в виде xml
Атрибут distance дает расстояние в метрах.
Распарсить xml я не могу т.к. этот отрезок vba мне дается тяжело
[vba]
Код
Sub DistanceXML() Dim urladr, a, b a = InputBox("Пункт А", "А", "") b = InputBox("Пункт Б", "Б", "") a = Replace(a, " ", "+") a = Replace(a, ",", "+") b = Replace(b, " ", "+") b = Replace(b, ",", "+")
urladr = "https://maps.googleapis.com/maps/api/distancematrix/xml?origins=" & a & "|Seattle&destinations=" & b ' далее мне нужно распарсить код из гугл и получить цифры - дистанцию между пунктом А и Б в метрах distance -> value '<distance> '<value>11797</value>... '</distance>
MsgBox "Расстояние " & distance & " метров :)" End Sub
Не могу понять, что делаю не так, почему-то не работает у меня. посмотрите код, пожалуйста [vba]
Код
Sub LatLong() Dim a, lat, lng, urladr As String a = InputBox("Место назначения (Город, адрес)", "Пункт", "") urladr = "http://maps.google.com/maps/api/geocode/xml?address=" & Replace(a, " ", "+") & "&sensor=false" Set xmlDoc = CreateObject("Microsoft.XMLDOM") xmlDoc.Load urladr Do While xmlDoc.readyState <> 4 DoEvents Loop lat = xmlDoc.SelectSingleNode("//location/lat").Text lng = xmlDoc.SelectSingleNode("//location/lng").Text MsgBox lat & "," & lng End Sub
[/vba] [moder]Какое отношение этот вопрос имеет к расчету расстояния? Создайте новую тему.[/moder]
Не могу понять, что делаю не так, почему-то не работает у меня. посмотрите код, пожалуйста [vba]
Код
Sub LatLong() Dim a, lat, lng, urladr As String a = InputBox("Место назначения (Город, адрес)", "Пункт", "") urladr = "http://maps.google.com/maps/api/geocode/xml?address=" & Replace(a, " ", "+") & "&sensor=false" Set xmlDoc = CreateObject("Microsoft.XMLDOM") xmlDoc.Load urladr Do While xmlDoc.readyState <> 4 DoEvents Loop lat = xmlDoc.SelectSingleNode("//location/lat").Text lng = xmlDoc.SelectSingleNode("//location/lng").Text MsgBox lat & "," & lng End Sub
[/vba] [moder]Какое отношение этот вопрос имеет к расчету расстояния? Создайте новую тему.[/moder]Валерьянка
Сообщение отредактировал SLAVICK - Четверг, 04.02.2016, 15:47
Googlе рассчитывает расстояние исходя из маршрута и средства передвижения, загруженности дороги и т.п. потому расстояние может постоянно изменятся. Наиболее точное геодезическое расстояние, для оценки отдаленности, можно получить от пункта А до Б по прямой
Вот что у меня получилось собрать :)
[vba]
Код
Sub Расстояние() Const pi = 3.14159265358979 ' определяем константу pi lat1 = 56.7529556 ' Широта А lng1 = 37.1969234 ' Долгота А lat2 = 56.7523821 ' Широта Б lng2 = 37.1976746 ' Долгота Б ' переводим градусы в радианы GradToRadLat1 = lat1 * pi / 180 ' Радианы Широты А GradToRadLng1 = lng1 * pi / 180 ' Радианы Долготы А GradToRadLat2 = lat2 * pi / 180 ' Радианы Широты Б GradToRadLng2 = lng2 * pi / 180 ' Радианы Долготы Б a = 6378137 ' экваториальный радиус земли (метров) f = 1 / 298.257223563 ' сжатие b = a * (1 - f) ' полярный радиус GSinLat = (Sin((GradToRadLat1 - GradToRadLat2) / 2) ^ 2) 'Гаверсинус широты GSinLng = (Sin((GradToRadLng1 - GradToRadLng2) / 2) ^ 2) 'Гаверсинус долготы CosLat = Cos(GradToRadLat1) * Cos(GradToRadLat2) 'Произведение косинусов широт 'вычисление арксинуса угла (Sqr(GSinLat + GSinLng * CosLat) x = Sqr(GSinLat + GSinLng * CosLat) Arcsin = Atn(x / Sqr(-x * x + 1)) 'расчет дистанции dist = (a + b) * Arcsin MsgBox dist End Sub
Googlе рассчитывает расстояние исходя из маршрута и средства передвижения, загруженности дороги и т.п. потому расстояние может постоянно изменятся. Наиболее точное геодезическое расстояние, для оценки отдаленности, можно получить от пункта А до Б по прямой
Вот что у меня получилось собрать :)
[vba]
Код
Sub Расстояние() Const pi = 3.14159265358979 ' определяем константу pi lat1 = 56.7529556 ' Широта А lng1 = 37.1969234 ' Долгота А lat2 = 56.7523821 ' Широта Б lng2 = 37.1976746 ' Долгота Б ' переводим градусы в радианы GradToRadLat1 = lat1 * pi / 180 ' Радианы Широты А GradToRadLng1 = lng1 * pi / 180 ' Радианы Долготы А GradToRadLat2 = lat2 * pi / 180 ' Радианы Широты Б GradToRadLng2 = lng2 * pi / 180 ' Радианы Долготы Б a = 6378137 ' экваториальный радиус земли (метров) f = 1 / 298.257223563 ' сжатие b = a * (1 - f) ' полярный радиус GSinLat = (Sin((GradToRadLat1 - GradToRadLat2) / 2) ^ 2) 'Гаверсинус широты GSinLng = (Sin((GradToRadLng1 - GradToRadLng2) / 2) ^ 2) 'Гаверсинус долготы CosLat = Cos(GradToRadLat1) * Cos(GradToRadLat2) 'Произведение косинусов широт 'вычисление арксинуса угла (Sqr(GSinLat + GSinLng * CosLat) x = Sqr(GSinLat + GSinLng * CosLat) Arcsin = Atn(x / Sqr(-x * x + 1)) 'расчет дистанции dist = (a + b) * Arcsin MsgBox dist End Sub
Это конечно хорошо - Вы молодец. Только зачем опять изобретать велосипед? - можно же было просто спросить Такой расчет давно есть даже в формульном виде, в том числе здесь на форуме. И как по мне формулу намного проще применить в таблицы . А на счет точности - это кому что нужно. Если нужно расстояние напрямую - то так, но если нужно просчитать затраты на бензин, например, то река или гора в раз перечеркнет эти расчеты. Здесь и приходит на помощь googleapis
Это конечно хорошо - Вы молодец. Только зачем опять изобретать велосипед? - можно же было просто спросить Такой расчет давно есть даже в формульном виде, в том числе здесь на форуме. И как по мне формулу намного проще применить в таблицы . А на счет точности - это кому что нужно. Если нужно расстояние напрямую - то так, но если нужно просчитать затраты на бензин, например, то река или гора в раз перечеркнет эти расчеты. Здесь и приходит на помощь googleapisSLAVICK
А так намного короче. Set xmlDoc = CreateObject("Microsoft.XMLDOM") xmlDoc.Load urladr Do While xmlDoc.readyState <> 4 DoEvents Loop distance = xmlDoc.SelectSingleNode("//distance/value").Text MsgBox "Расстояние " & distance & " метров :)"
Подскажите как доработать код чтобы получить информацию не только об общем расстоянии, но и по steps и legs. В описании Directions API Google описывается возможность, но я никак не могу разобраться!
А так намного короче. Set xmlDoc = CreateObject("Microsoft.XMLDOM") xmlDoc.Load urladr Do While xmlDoc.readyState <> 4 DoEvents Loop distance = xmlDoc.SelectSingleNode("//distance/value").Text MsgBox "Расстояние " & distance & " метров :)"
Подскажите как доработать код чтобы получить информацию не только об общем расстоянии, но и по steps и legs. В описании Directions API Google описывается возможность, но я никак не могу разобраться!00Vlad00
Подскажите, пожалуйста, в чем ошибка? код - не сложный, а разобраться в причине ошибки не могу. Выдает ошибку на присвоении значения переменной distance [vba]
Код
Dim a$, b$, distance$, XMLDoc As Object a = Cells(1, 1) b = Cells(2, 1)
Dim firstVal As String, secondVal As String, lastVal As String firstVal = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=" secondVal = "&destinations=" lastVal = "&mode=car&language=pl&sensor=false" URL = firstVal & Replace(a, " ", "+") & secondVal & Replace(b, " ", "+") & lastVal Cells(3, 1) = URL
Set XMLDoc = CreateObject("Microsoft.XMLDOM") XMLDoc.Load URL Do While XMLDoc.readyState <> 4 DoEvents Loop distance = XMLDoc.SelectSingleNode("//distance/value").Text MsgBox "Ðàññòîÿíèå " & distance & " ìåòðîâ :)"
End Sub
[/vba]
Подскажите, пожалуйста, в чем ошибка? код - не сложный, а разобраться в причине ошибки не могу. Выдает ошибку на присвоении значения переменной distance [vba]
Код
Dim a$, b$, distance$, XMLDoc As Object a = Cells(1, 1) b = Cells(2, 1)
Dim firstVal As String, secondVal As String, lastVal As String firstVal = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=" secondVal = "&destinations=" lastVal = "&mode=car&language=pl&sensor=false" URL = firstVal & Replace(a, " ", "+") & secondVal & Replace(b, " ", "+") & lastVal Cells(3, 1) = URL
Set XMLDoc = CreateObject("Microsoft.XMLDOM") XMLDoc.Load URL Do While XMLDoc.readyState <> 4 DoEvents Loop distance = XMLDoc.SelectSingleNode("//distance/value").Text MsgBox "Ðàññòîÿíèå " & distance & " ìåòðîâ :)"
Вы же не json обрабатываете. Есть firstVal = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=" Должно быть firstVal = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins="
Вы же не json обрабатываете. Есть firstVal = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=" Должно быть firstVal = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins="doober
а как такое может быть? Если взять URL и вставить его в адресную строку, то все правильно отображается, даже через json. Остается узнать, в чем проблема, ведь есть сообщение №3, и его улучшив сообщением №4, результат должен оставаться тем же. Но это не так. Помогите разобраться
а как такое может быть? Если взять URL и вставить его в адресную строку, то все правильно отображается, даже через json. Остается узнать, в чем проблема, ведь есть сообщение №3, и его улучшив сообщением №4, результат должен оставаться тем же. Но это не так. Помогите разобратьсяEalataur