Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.03.2018, 17:02
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Геокодирование Google и Яндекс

Доброго времени суток!

Перед тем как писать этот пост, я просмотрел много примеров, прочитал как люди реализуют работу с 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  
Старый 25.03.2018, 18:42
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от LIONSMILE
...как реализовать возможность запроса на русском языке?...
Да это возможно не гугельмопс глючит, это кодировка xml подводит - выводится utf-8, хорошо бы сменить первую строчку в теле файла на <?xml version="1.0" encoding="windows-1251" ?>

З.Ы.
Цитата:
...И сразу попутный вопрос...
Код:
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  
Старый 25.03.2018, 21:42
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо огромное!
Ответить с цитированием
  #4  
Старый 26.03.2018, 18:23
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Уважаемый 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  
Старый 27.03.2018, 04:38
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от LIONSMILE
...почему не читает значения из тэга <pos>?...
Видимо, нестандартная разметка xml, поскольку при методовом разборе тег содержит лишь комментарий типа <pos> xmlns="http://www.opengis.net/gml"></pos>, так и не понял, почему такое происходит, но можно "ручками" разобрать, кстати, там их несколько
Код:
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  
Старый 27.03.2018, 09:11
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Я за два дня перечитал много информации, но так вразумительного ничего и не нашел. Пытался и циклом проходить по файлу, все равно не получилось, вообщем как не бился - не удалось. Открыв файл (несколько даже разных) в анализаторе XML кода - странно конечно, но дерево строилось так, как будто в тэге <pos> есть данные, поэтому и пытался их считать. На будущее буду теперь знать!

Спасибо огромное!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:47.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025