Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2015, 18:46   #21
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Та ладно руками, вот небольшой говнокод для программной проверки. Имя файла не забудь засунуть в xml
Код:
procedure TForm1.Button1Click(Sender: TObject);
var xLeg,xStep: IXMLNode;
    i,j: Integer;
    XBeg,YBeg,XEnd,YEnd,X,Y: Double;
    s: String;
begin
  DecimalSeparator:='.';
  XML.Active:=True;
  xLeg:=XML.DocumentElement.ChildNodes.FindNode('route').ChildNodes.FindNode('leg');
  for i:=0 to xLeg.ChildNodes.Count-1 do
    if AnsiSameText(xLeg.ChildNodes.Nodes[i].NodeName,'step') then begin
      xStep:=xLeg.ChildNodes.Nodes[i];
      XBeg:=StrToFloat(String(xStep.ChildNodes.FindNode('start_location').ChildNodes.FindNode('lat').NodeValue));
      YBeg:=StrToFloat(String(xStep.ChildNodes.FindNode('start_location').ChildNodes.FindNode('lng').NodeValue));
      XEnd:=StrToFloat(String(xStep.ChildNodes.FindNode('end_location').ChildNodes.FindNode('lat').NodeValue));
      YEnd:=StrToFloat(String(xStep.ChildNodes.FindNode('end_location').ChildNodes.FindNode('lng').NodeValue));
      s:=UnConvert(xStep.ChildNodes.FindNode('polyline').ChildNodes.FindNode('points').NodeValue);
      j:=Pos(' ',s); X:=StrToFloat(Copy(s,1,j-1)); s:=Copy(s,j+1,Length(s));
      j:=Pos(' ',s); Y:=StrToFloat(Copy(s,1,j-1)); s:=Copy(s,j+1,Length(s));
      while s<>'' do begin
        j:=Pos(' ',s); X:=X+StrToFloat(Copy(s,1,j-1)); s:=Copy(s,j+1,Length(s));
        j:=Pos(' ',s); Y:=Y+StrToFloat(Copy(s,1,j-1)); s:=Copy(s,j+1,Length(s));
      end;
      Memo1.Lines.Add(FloatToStrF(XBeg,ffFixed,12,5)+' '+FloatToStrF(YBeg,ffFixed,12,5)+' '+
                      FloatToStrF(XEnd,ffFixed,12,5)+' '+FloatToStrF(YEnd,ffFixed,12,5)+' '+
                      FloatToStrF(X,ffFixed,12,5)+' '+FloatToStrF(Y,ffFixed,12,5));
    end;
end;
PS

На всякий случай - так в реальной программе делать противопоказано
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.07.2015 в 19:32.
Аватар вне форума Ответить с цитированием
Старый 10.07.2015, 18:47   #22
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Вот такая штука...
Изображения
Тип файла: jpg tmp_6685-Screenshot_2015-07-10-21-45-351346447961.jpg (26.9 Кб, 123 просмотров)
ZuBy вне форума Ответить с цитированием
Старый 10.07.2015, 18:51   #23
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну не знаю, данные на первый взгляд корректные. Склоняюсь к мысли что программист не прав
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.07.2015, 09:51   #24
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

я пользуюсь таким кодом, т.к. msxml не работает под андроидом (а использовать oxml нет желания)

Код:
  Buff := FormatSettings;
  FormatSettings.DecimalSeparator := '.';

  while pos('<step>', Return) > 0 do
  begin
    // получаем блок step
    Str := Parse('<step>', '</step>', Return);

    // получаем блок start_location
    SubStr := Parse('<start_location>', '</start_location>', Str);
    pointLat := Parse('<lat>', '</lat>', SubStr);
    pointLon := Parse('<lng>', '</lng>', SubStr);

    if (not pointLat.IsEmpty) and (not pointLon.IsEmpty) then
    begin
      SetLength(Points, Length(Points) + 1);
      with Points[Length(Points) - 1] do
      begin
        Latitude := pointLat.ToDouble;
        Longitude := pointLon.ToDouble;
      end;
    end;
    // ...

    // получаем блок points
    SubStr := Parse('<points>', '</points>', Str);
    if not SubStr.IsEmpty then
    begin
      SubStr := DecoderPolyline(SubStr);
      with TStringList.Create do
      begin
        // разделяем текст
        Delimiter := ' ';
        DelimitedText := SubStr;
        lastLat := Strings[0]; // нач. точка latitude
        lastLon := Strings[1]; // нач. точка longitude
        SetLength(Points, Length(Points) + 1);
        with Points[Length(Points) - 1] do
        begin
          Latitude := lastLat.ToDouble;
          Longitude := lastLon.ToDouble;
        end;
        for i := 2 to Count - 2 do
        begin
          pointLat := Strings[i]; // смещение latitude
          pointLon := Strings[i + 1]; // смещение longitude
          SetLength(Points, Length(Points) + 1);
          with Points[Length(Points) - 1] do
          begin
            Latitude := lastLat.ToDouble + pointLat.ToDouble; // прибавляем смещение latitude к последнему значению
            Longitude := lastLon.ToDouble + pointLon.ToDouble; // прибавляем смещение longitude к последнему значению
            lastLat := Latitude.ToString; // запоминаем последнее значение latitude
            lastLon := Longitude.ToString; // запоминаем последнее значение longitude
          end;
        end;
        Free;
      end;
    end;
    // ...

    // получаем блок end_location
    SubStr := Parse('<end_location>', '</end_location>', Str);
    pointLat := Parse('<lat>', '</lat>', SubStr);
    pointLon := Parse('<lng>', '</lng>', SubStr);

    if (not pointLat.IsEmpty) and (not pointLon.IsEmpty) then
    begin
      SetLength(Points, Length(Points) + 1);
      with Points[Length(Points) - 1] do
      begin
        Latitude := pointLat.ToDouble;
        Longitude := pointLon.ToDouble;
      end;
    end;
    // ...

    Return := StringReplace(Return, '<step>', '<step_>', []);
    Return := StringReplace(Return, '</step>', '</step_>', []);
  end;
  FormatSettings := Buff;
ZuBy вне форума Ответить с цитированием
Старый 11.07.2015, 10:36   #25
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

как понять следующее:
Цитата:
Note that the backslash is interpreted as an escape character within string literals. Any output of this utility should convert backslash characters to double-backslashes within string literals.
и вот еще, уровень масштабирования тоже кодируется
Цитата:
An encoded polyline also stores information specifying the precision when drawing the polyline. This information allows the map to ignore drawing segments at zoom levels where that precision is not necessary. Each point in an encoded polyline stores this information in a levels string which is also encoded alongside the encoded points.
Цитата:
These level values are encoded in base64 as unsigned integers. Note that because level values are generally small, they shouldn't cross a 5-bit boundary; this results in level encodings being very simple: the value is simply added to 63. However, the encoding process below assumes you convert to a binary value and back again, and your code should perform this conversion in case the value of levels changes in an API revision.

Последний раз редактировалось ZuBy; 11.07.2015 в 11:04.
ZuBy вне форума Ответить с цитированием
Старый 12.07.2015, 10:49   #26
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
for i := 2 to Count - 2 do
Этот цикл не нравится, сильно. Там с шагом 2 нужно идти, а тело цикла это не учитывает. Абракадабра будет та ещё
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.07.2015, 10:52   #27
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

lastLat := Strings[0]; // нач. точка latitude
lastLon := Strings[1]; // нач. точка longitude

...
for i := 2 to Count - 2 do // начинается с 2 т.к. 0 и 1 значение взяли выше
begin
...
end;

а понял, точно. сейчас проверю
ZuBy вне форума Ответить с цитированием
Старый 12.07.2015, 10:54   #28
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

И брать нужно пары с индексами 2-3, 4-5, 6-7, ... а не 2-3, 3-4, 4-5 как в цикле
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.07.2015, 10:59   #29
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Аватар еще раз благодарю, переделал на while и задал шаг все получилось!
ZuBy вне форума Ответить с цитированием
Старый 12.07.2015, 11:00   #30
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну и Ok
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Google maps Samir_ Помощь студентам 10 13.03.2012 21:22
ya maps/google maps djetx Работа с сетью в Delphi 1 10.04.2011 21:19
Компонент для работы с Google Maps Дамир Общие вопросы .NET 4 23.12.2010 08:30
кеш google maps bazanin Работа с сетью в Delphi 3 17.03.2010 17:27
Помогите написать скрипт для Google Maps Mineralog JavaScript, Ajax 0 12.09.2009 20:11