Импортировать 150 картинок в базу данных за 3 минуты
Недавно я писал про базу данных с картинками. Может показаться, что занесение в ее графическое поле изображений — утомительный ручной процесс. Однако на самом деле всё сделано за считанные минуты небольшим groovy-скриптом.
Напомню, что координаты объектов на Google-картах были известны. Используя сервис статических карт нужно было оснастить записи картинками. Вот как это сделано:
Задействованный здесь метод stream2stream() я уже публиковал на Мтааламу, но, чтобы далеко не лазить, приведу еще раз:
Во избежание злоупотреблений, Google выдает за определенный небольшой промежуток времени не более 50 карт, так что скрипт пришлось запускать 3 раза с небольшими (пара минут) интервалами.
Напомню, что координаты объектов на Google-картах были известны. Используя сервис статических карт нужно было оснастить записи картинками. Вот как это сделано:
db = Sql.newInstance('jdbc:hsqldb:file:/path/to/db', 'SA', '', 'org.hsqldb.jdbc.JDBCDriver')
query = 'update name_descr_latlon set "mapimg"=? where "id"=?'
db.eachRow('select "id", "latlon" from name_descr_latlon where not ("latlon" is null) and "mapimg" is null'){ row ->
println row.id
url = new URL("http://maps.google.com/staticmap?markers=${row.latlon}&zoom=14&size=420x340")
baos = new ByteArrayOutputStream()
stream2stream(url.openStream(), baos)
ba = baos.toByteArray()
db.execute(query, [ba, row.id])
}
Задействованный здесь метод stream2stream() я уже публиковал на Мтааламу, но, чтобы далеко не лазить, приведу еще раз:
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import groovy.sql.Sql
def stream2stream = {is, os ->
src = Channels.newChannel(is);
dest = Channels.newChannel(os);
buffer = ByteBuffer.allocateDirect(16 * 1024);
while (src.read(buffer) != -1) {
buffer.flip();
dest.write(buffer);
buffer.compact();
}
buffer.flip();
while (buffer.hasRemaining())dest.write(buffer);
}
Во избежание злоупотреблений, Google выдает за определенный небольшой промежуток времени не более 50 карт, так что скрипт пришлось запускать 3 раза с небольшими (пара минут) интервалами.
Комментарии (4)
RSS свернуть / развернутьMarkony
Sergei_T
yababay
Sergei_T
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.