![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Доброго времени суток!
Перед тем как писать этот пост, я просмотрел много примеров, прочитал как люди реализуют работу с API, однако ввиду того, что API периодически меняется то и все примеры, которые смотрел не работают. Но как говорится надо все-таки, и тогда я полез в дебри и начал по немногу разбирать с технологиями API, в частности меня интересует функция геокодирования. Началось все с GOOGLE MAPS. Там в принципе сложного ничего нет, вроде бы разобрался, зарегистрировал себе API-KEY, все вроде бы работает, но есть одна проблема. Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
XMLDocument1.LoadFromFile(https://maps.googleapis.com/maps/api/geocode/xml?address=Moscow&key=MY_API_KEY);
XMLDocument1.Active := true;
Edit1.Text := XMLDocument1.DocumentElement.ChildNodes['result'].ChildNodes['geometry'].ChildNodes['location'].ChildNodes['lat'].Text;
Edit2.Text := XMLDocument1.DocumentElement.ChildNodes['result'].ChildNodes['geometry'].ChildNodes['location'].ChildNodes['lng'].Text;
XMLDocument1.Active := false;
end;Если использовать запрос в таком виде, все работает хорошо, данные отправляются и принимаются так как нужно. Но если в запросе изменить название места - т.е. "Moscow" на "Москва", то сразу вылетает ошибка. Почитал документацию на google, посмотрел параметры все которые там присутствуют, среди них я только нашел, язык вывода данных, т.е. то, что мы получаем в ответ. Хотя google по IP сам определяет место, откуда посылается запрос и выводит данные на языке, который используется в том месте, откуда посылается запрос. Вот сам ответ, который присылает google - google.txt Вопрос в том - как реализовать возможность запроса на русском языке? Далее немного подумав, что все-таки google это зарубежный сервис, а яндекс наш, то я добрался до последнего. На первый взгляд он показался намного проще предыдущего, даже если учитывать одно то, что использование API-ключа здесь совсем не обязательно. Но как всегда первый взгляд бывает обманчив. Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
XMLDocument1.LoadFromFile('https://geocode-maps.yandex.ru/1.x/?geocode=Волгоград');
XMLDocument1.Active := true;
Edit1.Text := XMLDocument1.DocumentElement.ChildNodes.Nodes['GeoObjectCollection'].ChildNodes.Nodes['GeoObject'].ChildNodes.Nodes['Point'].ChildNodes.Nodes['pos'].text;
Edit1.Text := XMLDocument1.DocumentElement.ChildNodes.Nodes['GeoObjectCollection'].ChildNodes.Nodes['GeoObject'].ChildNodes.Nodes['Point'].ChildNodes.Nodes['pos'].text;
XMLDocument1.Active := false;
end;Вот собственно код самого ответа в XML, который присылает яндекс. яндекс.txt Вроде бы и запрос уходит, а на выходе ничего нет. В чем моя ошибка в работе с яндекс? И сразу попутный вопрос - как реализовать чтобы данные, полученные от яндекс записывались в разные компоненты, т.е. из <pos>37.592797 55.771494</pos> в EDIT1 записывалась широта "37.592797", а в EDIT2 долгота "55.771494"? P.S. Alegun, про "ледяной лёд" я помню, понимаю, что код очень кривой, но увы я пока только учусь. Заранее спасибо! |
|
#2
|
||||
|
||||
|
Цитата:
З.Ы. Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
i: integer;
flg: boolean;
sl: TStrings;
begin
s:= '<pos>37.592797 55.771494</pos>';
// Delete(s,1,5);
// Delete(s,Length(s)-5,6);
// Edit1.Text:= Copy(s,1,pos(' ',s));
// Edit2.Text:= Copy(s,pos(' ',s),Length(s));
{ Edit1.Clear;
Edit2.Clear;
flg:= false;
for i := 1 to Length(s) do
if s[i] in ['0'..'9', '.', ' '] then
begin
if flg then Edit2.Text:= Edit2.Text + s[i] else
if s[i] <> ' ' then Edit1.Text:= Edit1.Text + s[i];
if s[i] = ' ' then flg:= true;
end;}
sl:= TStringList.Create;
sl.DelimitedText:= s;
Edit1.Text:= StringReplace(sl[0],'<pos>','',[]);
Edit2.Text:= StringReplace(sl[1],'</pos>','',[]);
sl.Free;
end;Последний раз редактировалось Alegun, 25.03.2018 в 21:14. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
LIONSMILE (25.03.2018)
| ||
|
#3
|
||||
|
||||
|
Спасибо огромное!
|
|
#4
|
||||
|
||||
|
Уважаемый Alegun!
А как быть с этим, почему не читает значения из тэга <pos>? Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
XMLDocument1.LoadFromFile('https://geocode-maps.yandex.ru/1.x/?geocode=Волгоград');
XMLDocument1.Active := true;
Edit1.Text := XMLDocument1.DocumentElement.ChildNodes.Nodes['GeoObjectCollection'].ChildNodes.Nodes['GeoObject'].ChildNodes.Nodes['Point'].ChildNodes.Nodes['pos'].text;
Edit1.Text := XMLDocument1.DocumentElement.ChildNodes.Nodes['GeoObjectCollection'].ChildNodes.Nodes['GeoObject'].ChildNodes.Nodes['Point'].ChildNodes.Nodes['pos'].text;
XMLDocument1.Active := false;
end;Как ни пытался ошибок нет, но не читает. Скачал файл на комп, пробовал так, все равно. Вроде бы путь верный. Спасибо! |
|
#5
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
s: string;
i,j,b: integer;
begin
XMLDocument1.LoadFromFile('yandex.txt');
XMLDocument1.Active:= true;
// Выдёргиваются данные первого тега <pos>
{
s:= VarToStr(XMLDocument1.DocumentElement.ChildNodes.Nodes['GeoObjectCollection'].XML);
j:= Pos('<pos>', s)+5;
i:= Pos('</pos>',s);
s:= Copy(s, j, i-j);
j:= Pos(' ', s);
Edit1.Text:= Copy(s,1,j-1);
Edit2.Text:= Copy(s,j+1,(Length(s)-j)+1);
}
// Разбираются все
for b := 0 to XMLDocument1.XML.Count-1 do
with StringGrid1 do
if Pos('<pos>', XMLDocument1.XML[b]) > 0 then
begin
RowCount:= RowCount+1;
s:= XMLDocument1.XML[b];
j:= Pos('<pos>', s)+5;
i:= Pos('</pos>',s);
s:= Copy(s, j, i-j);
j:= Pos(' ', s);
Cells[0,RowCount-1]:= Copy(s,1,j-1);
Cells[1,RowCount-1]:= Copy(s,j+1,(Length(s)-j)+1);
end;
XMLDocument1.Active:= false;
end; |
|
#6
|
||||
|
||||
|
Я за два дня перечитал много информации, но так вразумительного ничего и не нашел. Пытался и циклом проходить по файлу, все равно не получилось, вообщем как не бился - не удалось. Открыв файл (несколько даже разных) в анализаторе XML кода - странно конечно, но дерево строилось так, как будто в тэге <pos> есть данные, поэтому и пытался их считать. На будущее буду теперь знать!
Спасибо огромное! |