|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Пакетное геокодирование. Как создать пакет запросов?
Доброго времени суток!
Благодаря помощи многоуважаемого Alegun, разобрался с геокодированием Яндекса. Точее как правильно разбирать данные. Возник один вопрос. А возможно ли каким-нибудь способом организовать выполнение запросов (их разборов соответственно) в пакетном режиме, ибо когда адресов не много, то по одному их можно и в обычном браузере геокодировать (конечно есть и сайты, которые выполняют операцию пакетного геокодирования), но данные потом нужно будет еще не один раз обработать, чтобы привести их в нужный вид в конечном результате, и прыгать с браузера на приложение не совсем удачная идея. В проекте задумал загружать данные по средствам таблицы MS Excel в Stringgrid, затем выполнять пакетное геокодирование, и сохранять их обратно в MS Excel (это чтобы не писать тут весь код громоздкого проекта, в котором еще куча этапов обработки полученных данных). В моем проекте мне нужен всего 1 обработчик на Button2, который и будет выполнять сообственно процедуру пакетного геокодирования. Алгоритм работы такой: сначала загружаем в список адресов из таблицы MS Excel в Stringgrid1, далее выполняем пакет запросов и разбор полученных данных, полученные данные заносим в столбцы 2 и 3 Stringgrid2 (соответственно широта и долгота), а в первый столбец просто переносим данные из Stringgrid1 (адреса). В принципе чтобы не писать лишние строки, то можно данные сохранять и в исходный файл, т.е. добавлять еще две колонки к уже имеющейся там. Проект: Геокодирование.ZIP Помогите пожалуйста с обработчиком Button2. Cпасибо заранее! |
#2
|
||||
|
||||
Как понял, в табличке *.xls есть список адресов, нужно автоматизировать в цикле добавление к ним координат в формате > lat= > lon=, можно это всё проделать и без промежуточной загрузки в стрингрид, но нужна доп.инфа - как выполняется в браузере запрос для одного адреса, что отправляется и что возвращается, как вы такое вытворяете, покажите пжлст
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
Доброго времени суток!
Запросы отправлять можно следующим образом, вариантов несколько. https://geocode-maps.yandex.ru/1.x/?geocode=Волгоград https://geocode-maps.yandex.ru/1.x/?...Ростов-на-Дону ул. Текучева д.15 https://geocode-maps.yandex.ru/1.x/?...Ростов-на-Дону Театральная площадь https://geocode-maps.yandex.ru/1.x/?geocode=г. Ростов-на-Дону улица Портова дом 5 Браузер как ни странно и пробелы в строке тоже хавает и возвращает результаты в формате XML (сюда XML не грузит, изменил расширение на TXT) ОТВЕТ.TXT При этом в запросе вот эта часть https://geocode-maps.yandex.ru/1.x/?geocode= остается не изменной, меняется все что идет после знака равно. Что касаемо вывода в Stringgrid, так это просто для наглядности так задумано. Если конечно можно во втором StringGrid сделать разбор не только координат - но и адреса тоже, он приходит с ответом в XML. Т.е. алгоритм должен выглядеть примерно так я думаю: загрузили список адресо из файла MS Excel в 1 StrinGrid > нажаkb кнопку "Кодировать" > программа должна направить пакет запросов и получить столько же ответов > далее разбор и вывод ответов в Stringgrid 2. P.S. Ссылки копировать нужно вместе с адресом. Попытался обернуть тэгами - он как раз там где нужно видеть как идет запрос - убирает. Спасибо! Последний раз редактировалось LIONSMILE, 18.04.2018 в 04:02. |
#4
|
||||
|
||||
Цитата:
Код:
procedure TForm1.Button2Click(Sender: TObject); var s: string; i,j,b: integer; begin for b := 0 to StringGrid1.RowCount-1 do begin XMLDocument1.LoadFromFile('https://geocode-maps.yandex.ru/1.x/?geocode=' + StringGrid1.Cells[0, b]); Application.ProcessMessages; XMLDocument1.Active:= true; s:= VarToStr(XMLDocument1.DocumentElement.ChildNodes.Nodes['GeoObjectCollection'].XML); Application.ProcessMessages; j:= Pos('<pos>', s)+5; i:= Pos('</pos>',s); s:= Copy(s, j, i-j); j:= Pos(' ', s); with StringGrid2 do begin RowCount:= b; Rows[b][0]:= StringGrid1.Cells[0,b]; Rows[b][1]:= Copy(s,1,j-1); Rows[b][2]:= Copy(s,j+1,(Length(s)-j)+1); end; XMLDocument1.Active:= false; end; {for} end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
LIONSMILE (20.04.2018)
|
#5
|
||||
|
||||
Спасибо большое! Все работает.
Итог.jpg Немного подрихтовал - теперь считает так как нужно. Изначально загрузил запустил, нажал и о чудо, все работает. Но думаю дай ка я проверю все ли адреса находит или нет. Добавил несколько Label чтобы посчитать исходные строки загружаемые из файла MS Excel и сколько будет на выходе - итог немного удивил. Он почему-то не видел последню строку, которая грузилась в StringGrid1. Обычно цикл в StringGrid идет от 0 до -1, в большинстве случаев. Код:
for b := 0 to StringGrid1.RowCount-0 do Выгружает из StringGrid2 уже готовые данные в MS Excel без проблем (выгрузилось 46 строк). Спасибо огромное в очередной раз! P.S. Может быть кому-то в дальнейшем будет полезна информация о том, почему все сделано в пользу Яндекс, а не Google. Основных причин три, ньюансов масса, я про них даже писаь не хочу: 1. Количество запросов в сутки у Яндекса составляет 25 000, в свою очередь Google дает возможно делать только 1000. 2. Формат запроса писать проще для Яндекса, Google он их (импортный) с русским языком ему тяжело. 3. Яндекс карты лучше детализированы и несут в себе больше информации о территории РФ нежели карты GoogleMaps. Последний раз редактировалось LIONSMILE, 19.04.2018 в 04:10. |
#6
|
||||
|
||||
Оффтоп:
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
LIONSMILE (20.04.2018)
|
#7
|
||||
|
||||
Ну да, поправил - все работает! 46 из 46 обработал.
|