Геокодирование – еще один способ получения координат

В прошлой статье, я рассказывал, как можно получить координаты для карт того или иного объекта вручную . Это хороший и прямолинейный способ, который отлично работает в том случае, когда вы заранее знаете, что хотите показать пользователю. В случае, когда вы заранее этого не знаете (например, когда пользователь самостоятельно вводит адрес), нам пригодится геокодирование .

Геокодирование – это чрезвычайно сложный процесс преобразования адреса в координаты широты и долготы. К счастью, множество сервисов в интернете облегчили нам с вами эту задачу. Я не буду рассказывать про все из них, не буду рассказывать, как они работают, просто продемонстрирую, как можно решить поставленную задачу с использованием Google Geocoding Web Service.

Для того, чтобы воспользоваться веб сервисом, нужно послать запрос на сервер Google следующего вида:

где [type] – тип данных в котором вам придет ответ: xml или json

[address] – адрес, который вы ищете

В результате запроса:

вам приходит ответ следующего вида (json):

Величины lat и lng – это и есть искомые значения широты и долготы, которые в последствии могут быть использованы в картах.

Получение координат для карт

Вчера я рассказывал об использовании замечательной библиотеки leaflet для визуализации своих карт на сайте. При установке камеры и маркера я использовал координаты x, y и внимательные читатель задастся вопросом, как получить значения этих переменных для реальных объектов на карте, как это сделано у меня на примере карты бесплатных Wi-Fi источников .

X и Y – это значения широты и долготы. Существует несколько способов их получения. Сегодня я расскажу о самом прямолинейном и простом из них – ручном поиске. Он идеально подходит, если вы заранее знаете какие объекты вы хотите выделить и их количество не слишком велико. Для реализации этого метода нам потребуется ВикиМапия -  http://wikimapia.org/

В центе карты WikiMapia находится прицел:

Наводимся прицелом на нужный объект (для точности это лучше делать с большим увеличением) и в левом-нижнем углу видим координаты выбранного объекта:

Кликаем по ним и видим всплывающее окошко:

Значения из первой строки и являются искомыми нами x, y. Подставляем их в код создания маркера leaflet:

leaflet – создание карт для web

leaflet создание карт Сегодня речь пойдет о шикарной javascript библиотеке для создания собственных карт для веб-сайта – leaflet. Если вам нужно просто визуально показать расположение собственного офиса, то с этим справятся простейшие карты Google или Яндекс. Эти карты также помогут своим API вам, как разработчику, создать что-то более сложное, однако использовав leaflet, вы сделаете это быстрее и проще.

У меня уже запущен один проект, который базируется исключительно на этой библиотеке – это интерактивная карта бесплатных точек Wi-Fi в городе Донецке .

Подключаем библиотеку

Создаем div для карты в нужном месте, явно указывая размеры карты (это можно и нужно сделать в соответствующем css-файле) :

Инициализация карты

Создаем карту с координатами карты x, y и приближением z:

Присваиваем слой с картой:

Библиотека leaflet была разработана в поддержку сервису CloudMade, который является отличным провайдером разнообразных карт мира. Если ваш проект является коммерческим, то обязательно используйте карты CloudMade. В нашем учебном случае, мы используем карты бесплатного провайдера OpenStreetMap.

Добавляем простой маркер с описанием на карту:

Встраивать html5 видео все еще слишком сложно

Как встроить видео на сайт?

Короткий ответ – воспользуйтесь Youtube или Vimeo. Там работают чрезвычайно умные люди, которые уже решили совершенно все проблемы, которые могут возникнуть при встраивании видео на сайт.

Как это сделать без помощи сторонних сервисов?

Существует 4 основных группы людей, которые будут смотреть видео у вас на сайте:

  1. Использующие современные браузеры с поддержкой коммерческих кодеков (Chrome, Safari, IE9+)
  2. Использующие современные браузеры с поддержкой некоммерческих кодеков (Firefox, Opera)
  3. Устаревшие браузеры (IE)
  4. Слабые мобильные устройства (iPhone 3GS, дешевые Android устройства)

В оставшейся части этого поста я уделю внимание тому, как можно осуществить поддержку всех этих устройств и браузеров у себя на сайте.

Проигрывание видео в Chrome, Safari и IE9+

Самый простой случай. Видео-проигрыватель в одну строчку:

Поддержка устаревших браузеров

Для поддержки устаревших браузеров (в первую очередь под этой фразой следует понимать IE7+) будем использовать javasript-библиотеку html5media.js, которая будет создавать flash видеоплеер для случая устаревшего браузера:

Добавляем закрывающий тег , чтобы устаревшие браузеры не расстраивались от увиденного.
На данный момент наш проигрыватель поддерживает следующие браузеры:

  • Chrome
  • Safari(включая iPhone 4)
  • IE9+
  • IE8(flash)
  • Firefox(flash)
  • Opera(flash)

Минусы такой реализации: видео не проигрывается у пользователей firefox и opera без установленного флеша, а также у пользователей слабых мобильных устройств.

Поддержка браузеров с open source кодеками

Для того, чтобы пользователи с браузерами, которые используют open source кодеки, смогли смотреть ваше видео без flash-костыля, вы должны перекодировать видео в open source формат. Например, в WebM. В таком случае код встраивания примет такую форму:

На данный момент наш проигрыватель поддерживает следующие браузеры:

  • Chrome
  • Safari(включая iPhone 4)
  • IE9+
  • IE8(flash)
  • Firefox
  • Opera

Теперь остались только владельцы слабых мобильных устройств.

Поддержка слабых мобильных устройств

Современные мобильные устройства поддерживают видео в высоком разрешении, но дешевые Android устройства или iPhone 3GS откажутся проигрывать что-то большее 320 x 180 пикселей. Чтобы поддерживать проигрывание вашего видео на этих устройствах вам необходимо создать видео в данном разрешении и использовать следующий код:

На данный момент наш проигрыватель поддерживает следующие браузеры/устройства:

  • Chrome
  • Safari(включая iPhone 4, iPhone 3GS)
  • IE9+
  • IE8(flash)
  • Firefox
  • Opera
  • Android (включая дешевые устройства)

У меня все еще, что-то не работает

Проверяйте корректность декодирования видео в разные форматы или настройки своего сервера.

Nancy Framework

Nancy – это легковесный веб-фреймворк для .net. Я уже имел возможность использовать этот фреймворк для написания нескольких коммерческих проектов и могу сказать, что работать с ним – одно удовольствие. Причем он подходит не только для начинающих веб-разработчиков, но и для профессионалов своего дела.

Начнем по-порядку.

Установка Nancy

PM> Install-Package Nancy

или с сайта  http://nancyfx.org/

Пишем первый сайт

Готово!

Сайт на Nancy готов.

Aurora.js – аудио фреймворк для web

Aurora.js – фреймворк, который позволяет значительно упростить написание аудио декодера средствами JavaScript. Фреймворк берет на себя организацию низкоуровневых процессов: работу с бинарными данными, декодирование и работу с оборудованием, создавая собственную абстракцию над этими процессами. Aurora.js имеет два высокоуровневых API для считывания информации и проигрывания аудио. Фреймворк легко расширяется для поддержки других форматов, декодеров и аудио-устройств.

Демо

Исходники

Планы и всякое

Я давно не писал в блог “просто так”, о жизни. Этот пост будет посвящен этому. Я расскажу о том, чем я живу в последнее время, о прогрессе в разработке Ignite и о своих планах на будущее.

С 2009-го года я был в свободном плавании – будучи некрасиво уволенным по сокращению с предыдущего места работы, я не нашел ничего лучшего, чем открыть субъект предпринимательской деятельности и продолжить работать самостоятельно, на себя. Дела шли неплохо, но этот пост не про это, как и не про то, как в нашем государстве(Украина) способствуют развитию мелкого бизнеса. Скажу только, что к 2013-му году работать стало окончательно невозможно, и я начал искать работу программиста на стороне.

Этим я занимался полтора месяца (с конца января). После  ведения своего бизнеса, было интересно окунуться в работу других предприятий, в то как они предлагая копейки, пытаются найти нормального специалиста, в то что узнав про какой-нибудь пробел в знаниях его раздували до размеров слона и т.д. В итоге, работу я конечно же нашел, и сейчас все еще продолжаю получать письма с предложениями на все те же вакансии, куда не прошел. Забавно.. но этот пост не про это.

Я пошел работать на должность web developer`a и разрабатываю сейчас интересное web-приложение для своей компании. Она не занимается аутсорсом (как 99% компаний в Украине) и это первое, что меня радует. Второе – то что мне удалось совладать с собой и стресс с депресняком, которые преследовали меня при поиске работы и получении отказов, не заставили меня сменить ни род деятельности, ни даже язык программирования.. хотя конечно акцент с десктопов сместился на веб. Я все также продолжаю совершенствовать свои знания C# и .net framework.

От работы перейдем к личным проектам: работа над Ignit’ом опять застопорилась – за последние три недели я не написал ни строчки кода(ну может быть несколько). Если честно, мне просто надоело его писать. И, вероятно, это будет концом его разработки. В ближайшие дни я соберу версию, пригодную для публикации, и выдам ее на гора. Возможно, исходные коды уедут на github, но, если честно, мне стыдно за некоторые(многие) места времен hello world моего обучения языку C#. Возможно, публичный (сырой) релиз подстегнет мой интерес.. если же нет, то в задумке крутится новая (и совершенно не похожая на предыдущую) игра:

Игра будет написана с использованием MonoGame и будет поддерживать Windows/Linux из коробки и MacOS/iOS/Android в перспективе. Рабочее название Into the Void. Тематика: первое освоение далекого космоса.

C# Отложенное получение данных

Иногда при программировании сталкиваешься с задачей, которая выполняется длительное время. Обычно такие операции выполняют в отдельном потоке, чтобы не мешать ходу работы программы – таким образом решается проблема недоступности потока программы во время выполнения длительной операции, однако тут же возникает проблема синхронизации полученных в результате длительных вычислений данных с данными программы. Тут не работает привычная присваивания:

В моей программе, я использую BackgroundWorker’ы для выполнения длительных вычислений. BackgroundWorker асинхронно выполняет поставленную ему задачу (в событии DoWork), а после ее выполнения может сделать еще какие-нибудь действия (событие RunWorkerCompleted):

К сожалению, если мы передадим переменную, которая должна измениться в результате выполнения асинхронного запроса с модификаторами out или ref следующим образом:

, то это приведет к ошибке на этапе компиляции, т.к. передача ref/out переменных в анонимные методы запрещена.

Обойдем это с использованием собственного класса:

Класс очень простой: он состоит из свойства Value типа Т (т.е. любого, заявленного заранее, типа) и события, которое срабатывает, когда Value изменяется.

Пример использования класса:

В данном случае, strings перестанет равняться null в момент завершения асинхронной операции.

Управление свободной камерой


SITE-MAP