пятница, 10 октября 2008 г.

GeoRSS и его использование на Virtual Earth и Google Maps

GeoRSS это еще один пример удачного расширения формата RSS (я уже рассказывал о других удачных расширениях). Этот формат позволяет встраивать информацию о географическом положении объектов, так называемый геокодинг. Многие сервисы уже начинают использовать эту информацию – и как поставщики, например FLickr выставляет данные о месте, где сделана фотография, если таковая имеется, и как потребители, например в Google Maps можно ввести адрес потока rss с геоданными и он их покажет. Или интересный сервис Panaramio, ототого же Гугла, и как поставщик и как потребитель GeoRSS, здесь можно посмотреть фотографии интересных мест (необязательно известных), сделанные самими пользователями.

Ну с теорией достаточно, теперь посмотрим как это можно сделать на своем сайте (конечно с помощью .NET :) ).

Во-первых, генерация RSS потока с нужными расширенями. Тут ничего нового. Как я описывал уже, с помощью SyndicationFeed и LINQ for XML это очень просто. Есть и готовые обертки для генерации GeoRSS данных.

Во-вторых, нам надо показывать эти данные у себя на сайте. Мне известны два популрных картограцических сервисов с API для встраивания карт у себя – Google Maps от Гугл и Virtual Earth от Майкрософт. Оба сервиса имеют функциональность показа GeoRSS потоков. Как не удивительно, но у Майкрософт с этим удобнее и больше контроля над покащываемыми данными.

На Google Maps достаточно добавить специальный слой и всё.

// The GGeoXml constructor takes a URL pointing to a KML or GeoRSS file.
// You add the GGeoXml object to the map as an overlay, and remove it as an overlay as well.
// The Maps API determines implicitly whether the file is a KML or GeoRSS file.

function initialize()
{
  if (GBrowserIsCompatible())
  {
    map = new GMap2(document.getElementById("map_canvas"));
    geoXml = new GGeoXml(http://mapgadgets.googlepages.com/cta.kml);
    map.addControl(new GLargeMapControl());
    map.addOverlay(geoXml);
  }
}

Но под “всё” имеено всё и заканчивается. Больше никакой информации мы не имеем, ни количество объектов, ни их расположение, ничего. Какие-то свойства мы может контролировать в самом RSS потоке, как цвета, иконки и т.д. Но если, например, мы используем внешний фид, с третего сайта – этого ничего нам недоступно.


На Virtual Earth мы также можем добавить специальный слой на карту

var veLayerSpec = new VELayerSpecification();
veLayerSpec.Type = VELayerType.GeoRSS;
veLayerSpec.ID = 'Hazards';
veLayerSpec.LayerSource = 'http://localhost/hazards/hazards.xml';
veLayerSpec.Method = 'get';
veLayerSpec.IconUrl = 'hazard.gif';
map.AddLayer(veLayerSpec);
 

или импортировать объекты из GeoRSS потока в существующий слой

var slGeoRSS= new VEShapeLayer();
var veLayerSpec = new VEShapeSourceSpecification(VEDataType.GeoRSS, url, slGeoRSS);
map.ImportShapeLayerData(veLayerSpec, null, false);
 

При этом у нас имеются события при ипорте, где мы можем получить доступ ко все объектам из RSS и поменять их, как нам захочется.


Еще смежной, но отдельной темой, с которой я столкнулся при работе над проектами моих заказчиков – это хранение и показ собственных географических данных на картах. В предыдущих примерах имелось ввиду что геоданные у нас имеются, причем в нужном формате для GeoRSS. Так вот, чтобы они действительно имелись, очень удобно оказалось использовать новый тип географических данных в Microsoft SQL Server 2008. Так называемый Spatial data type, куда входит geometry тип и geography тип. Но об этом как-нибудь в другой раз. :)

Комментариев нет: