Все ли хорошо в Openlayers
Добавлено: 20 фев 2009, 01:42
Благодаря Вашему форуму 01.01.2009 начал освоение Openlayers.
Спасибо администратору этого форума!
Создал пирамиду из .jpg 256*256 средний размер каждого ~ 7 Kb (у Googlemap точнее у Digital Globe ~ 7.5 Kb)
Использовал OpenLayers.Layer.TMS
Подобрал коеффициенты для расчета расстояний на карте – все в пределах допустимой погрешности.
Затем попробовал загрузить KML файл с векторными слоями.
Получилось, но загрузка недопустимо медленная.
Так что этот подход и все прочие текстовые и гипертекстовые оставляем только для ввода новой информации (по сп. навигаторам).
Подключил OpenLayers.Protocol.SQL.Gears
Это локальная база данных, построенная на основе sqlite
http://www.nestor.minsk.by/sr/2008/02/sr80204.html
Пока все замечательно.
Подключил интерфейс по сохранению в локальной базе векторных слоев (функции выбора объекта, групповое выделение объектов, корректировка, перемещение объектов, удаление, вывод информации по выбранным...)
Затем загрузил в google gears часть адресного плана - 20000 подписей зданий, подписи улиц.
Использовал "Point" с параметрами
OpenLayers.Style({
externalGraphic: "${img_url}",
rotation: "${angle}",
. . .
Google Gears в связке с Openlayers нормально работает, если на экране около 150 объектов типа "Point" + 20 объектов типа "Line" (транспортный граф). Мне необходимо отобразить 400 "Point" минимум на экране. В результате регулярно получаю ошибку:
? Сценарий, исполняемый на этой странице, возможно занят или не отвечает. Вы можете остановить его сейчас или продолжить и посмотреть сможет он завершить свою работу.
Вы скажете теперь поставь Mapserver или Geoserver с WFS-T на сервере.
Две проблемы :
1. Как я понимаю Mapserver или Geoserver преобразуют векторные слои в битмап,
Нарежут битмап в пропорциях моего масштаба и отобразят их поверх моего основного слоя TMS
При просмотре на http://maps.google.ru/ HYBRID поверх .jpg наложен прозрачный .png
Предполагаю это занимет 20-30 Kb
Все неплохо только где интерактив.
2. У хостера минимальный джентельменский набор из Apache+Php+MySQL
Устанавливать Mapserver пока отказывается.
Так что вопрос про PHPGIS актуален.
Собираюсь переписать Protocol.SQL.Gears на Php+MySQL
Вопросы:
Вопрос 1. Я не нашел в Openlayers инструмента "Текст" - инструмент используется для рисования текста (букв и цифр). При этом можно выбирать шрифт и угол поворота текста.
Тема надписи под углом
Варианты решений
Php
imagettftext(image, size, angle, x, y, col, fontfile, text)
Требуется библиотека GD
http://mysitez.km.ua/Programming/?graphfunc
«Работа с изображениями в PHP (часть первая)»).
- Наверное самый легкий в написании вариант
Но в результате мы посылаем битмап с сервера. Когда их несколько сотен на экране ….
Еще вариант нарезать прозрачных .gif или .png с буквами и цифрами.
Вариант – вставка java aplet в html - требует установки java на клиенте.
Вариант – использование на клиентской стороне activx компонент.
Другой вариант – использование библиотеки JavaScript
Raphaël—JavaScript Library
http://raphaeljs.com/
Пример поворота текста
text-rotation.html
Текст преобразует в битмап и поворачивает его. Но это уже происходит на клиентской стороне. В Openlayers есть возможность повернуть в point:
. . .
Задача сводится к преобразованию текста в битмап.
Другой вариант без преобразования в битмап:
А для поворота букв можно использовать шрифт под углом. Беру редактор шрифтов, поворачиваю все буквы на заданный угол. Я сделал шрифты через каждые 15". Попробовал вывести на одном экране до 50000 букв - работает.
Предложите ваши варианты решений.
Вопрос 2. Как в OpenLayers на крупных масштабах убрать векторные слои?
Пробовал вот так:
if (map.getZoom() < 7) {
vector.renderer.destroy();
}
Это не работает
Если по кнопке vector.renderer.destroy(); - работает
. . .
function clear_data() {
// vector.destroyFeatures();
vector.renderer.destroy();
}
. . .
<li><a href="javascript:clear_data();">Clear vector</a></li>
Пример если можно ?
Вопрос 3. Кеширование слоев Google maps в Openlayers
У меня кеширование происходит только в одном сеансе работы.
То есть покружил я над своим городом при втором заходе уже все .jpg грузятся быстрее (локально).
Если я закрыл браузер (FF) и заново его открыл - все заново кешируется.
Хотелось бы кешировать как Google Earth.
Спасибо администратору этого форума!
Создал пирамиду из .jpg 256*256 средний размер каждого ~ 7 Kb (у Googlemap точнее у Digital Globe ~ 7.5 Kb)
Использовал OpenLayers.Layer.TMS
Подобрал коеффициенты для расчета расстояний на карте – все в пределах допустимой погрешности.
Затем попробовал загрузить KML файл с векторными слоями.
Получилось, но загрузка недопустимо медленная.
Так что этот подход и все прочие текстовые и гипертекстовые оставляем только для ввода новой информации (по сп. навигаторам).
Подключил OpenLayers.Protocol.SQL.Gears
Это локальная база данных, построенная на основе sqlite
http://www.nestor.minsk.by/sr/2008/02/sr80204.html
Пока все замечательно.
Подключил интерфейс по сохранению в локальной базе векторных слоев (функции выбора объекта, групповое выделение объектов, корректировка, перемещение объектов, удаление, вывод информации по выбранным...)
Затем загрузил в google gears часть адресного плана - 20000 подписей зданий, подписи улиц.
Использовал "Point" с параметрами
OpenLayers.Style({
externalGraphic: "${img_url}",
rotation: "${angle}",
. . .
Google Gears в связке с Openlayers нормально работает, если на экране около 150 объектов типа "Point" + 20 объектов типа "Line" (транспортный граф). Мне необходимо отобразить 400 "Point" минимум на экране. В результате регулярно получаю ошибку:
? Сценарий, исполняемый на этой странице, возможно занят или не отвечает. Вы можете остановить его сейчас или продолжить и посмотреть сможет он завершить свою работу.
Вы скажете теперь поставь Mapserver или Geoserver с WFS-T на сервере.
Две проблемы :
1. Как я понимаю Mapserver или Geoserver преобразуют векторные слои в битмап,
Нарежут битмап в пропорциях моего масштаба и отобразят их поверх моего основного слоя TMS
При просмотре на http://maps.google.ru/ HYBRID поверх .jpg наложен прозрачный .png
Предполагаю это занимет 20-30 Kb
Все неплохо только где интерактив.
2. У хостера минимальный джентельменский набор из Apache+Php+MySQL
Устанавливать Mapserver пока отказывается.
Так что вопрос про PHPGIS актуален.
Собираюсь переписать Protocol.SQL.Gears на Php+MySQL
Вопросы:
Вопрос 1. Я не нашел в Openlayers инструмента "Текст" - инструмент используется для рисования текста (букв и цифр). При этом можно выбирать шрифт и угол поворота текста.
Тема надписи под углом
Варианты решений
Php
imagettftext(image, size, angle, x, y, col, fontfile, text)
Требуется библиотека GD
http://mysitez.km.ua/Programming/?graphfunc
«Работа с изображениями в PHP (часть первая)»).
- Наверное самый легкий в написании вариант
Но в результате мы посылаем битмап с сервера. Когда их несколько сотен на экране ….
Еще вариант нарезать прозрачных .gif или .png с буквами и цифрами.
Вариант – вставка java aplet в html - требует установки java на клиенте.
Вариант – использование на клиентской стороне activx компонент.
Другой вариант – использование библиотеки JavaScript
Raphaël—JavaScript Library
http://raphaeljs.com/
Пример поворота текста
text-rotation.html
Текст преобразует в битмап и поворачивает его. Но это уже происходит на клиентской стороне. В Openlayers есть возможность повернуть в point:
Код: Выделить всё
var myStyles = new OpenLayers.StyleMap({
"default": new OpenLayers.Style({
// для point
externalGraphic: "${image}",
// угол поворота битмапа
rotation: "${angle}",
Задача сводится к преобразованию текста в битмап.
Другой вариант без преобразования в битмап:
Код: Выделить всё
<html>
<head>
<title>Текст расположен под заданным углом на странице</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<STYLE>
.positioned { position: relative; color:red}
</STYLE>
<SCRIPT>
var id = 0;
function displayTextDiagonal (text, down, deg, lsp) {
deg = deg || 45;
deg = Math.PI / 180 * deg;
lsp = lsp || 10;
dy = lsp * Math.tan(deg);
var html = '';
html += '<DIV ID="td' + id + '"' + ' CLASS="positioned"' + '>';
if (down) {
for (var r = 0; r < text.length; r++) {
html += '<SPAN ID="td' + id + r
+ '" CLASS="positioned" STYLE="left: '
+ (r * lsp) + 'px; top: ' + (r * dy) + 'px;">';
html += text.charAt(r);
html += '</SPAN>';
}
}
else {
for (var r = 0; r < text.length; r++) {
html += '<SPAN ID="td' + id + r
+ '" CLASS="positioned" STYLE="left: '
+ (r * lsp) + 'px; top: '
+ ((text.length - r) * dy) + 'px;">';
html += text.charAt(r);
html += '</SPAN>';
}
}
html += '<\/DIV>';
id++;
document.write(html);
}
</SCRIPT>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<SCRIPT>
//displayTextDiagonal('Web Designs and', true, 80, 2);
</SCRIPT>
<SCRIPT>
for (var xx = 0; xx < 360; xx++) {
displayTextDiagonal('012345', false, xx, 2);
}
</SCRIPT>
</body>
</html>
Предложите ваши варианты решений.
Вопрос 2. Как в OpenLayers на крупных масштабах убрать векторные слои?
Пробовал вот так:
if (map.getZoom() < 7) {
vector.renderer.destroy();
}
Это не работает
Если по кнопке vector.renderer.destroy(); - работает
. . .
function clear_data() {
// vector.destroyFeatures();
vector.renderer.destroy();
}
. . .
<li><a href="javascript:clear_data();">Clear vector</a></li>
Пример если можно ?
Вопрос 3. Кеширование слоев Google maps в Openlayers
У меня кеширование происходит только в одном сеансе работы.
То есть покружил я над своим городом при втором заходе уже все .jpg грузятся быстрее (локально).
Если я закрыл браузер (FF) и заново его открыл - все заново кешируется.
Хотелось бы кешировать как Google Earth.