У меня есть фрейм данных, содержащий координаты различных мест, которые я хотел бы использовать с Google Планета Земля. Вот простой пример, показывающий структуру:
data <- data.frame(country = "USA", city = "Saint Paul",
lat = 44.9629, lon = -93.00146)
Я следил за этой записью SO и это руководство, чтобы успешно создать вывод KML
с помощью функции writeOGR()
из пакета rgdal
, однако у меня возникли проблемы с настройкой атрибутов. Вот код:
# you may need to install gdal itself for the package to install successfully
# install.packages("rgdal")
library(rgdal)
data_sp <- data
coordinates(data_sp) <- c("lon", "lat")
proj4string(data_sp) <- CRS("+init=epsg:4238")
data_ll <- spTransform(data_sp, CRS("+proj=longlat +datum=WGS84"))
writeOGR(data_ll["city"], "/path/to/test.kml", driver = "KML", layer = "city")
Результат отлично работает только для просмотра местоположений, но я хотел бы изменить атрибут <styleUrl>
, а также заполнить атрибут <name>
. Без него Google Планета Земля показывает местоположения с атрибутом [no name]
:
Вот результирующий файл .kml
:
<?xml version="1.0" encoding="utf-8" ?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document><Folder><name>city</name>
<Placemark>
<ExtendedData><SchemaData schemaUrl="#city">
<SimpleData name="city">Saint Paul</SimpleData>
</SchemaData></ExtendedData>
<Point><coordinates>-93.001753817020003,44.96282130428127</coordinates></Point>
</Placemark>
</Folder>
<Schema name="city" id="city">
<SimpleField name="city" type="string"></SimpleField>
</Schema>
</Document></kml>
Мне нужно либо получить элемент <name>
для заполнения содержимым SimpleField name="city"
, либо добавить теги <name>City</name>
к каждому элементу <Placemark>
. В качестве конечного результата я бы хотел что-то вроде этого (обратите внимание, добавлено определение <Style>
, добавлен атрибут <styleUrl>
для <Placemark>
и добавлен атрибут <name>
):
<?xml version="1.0" encoding="utf-8" ?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Style id="custom">
<IconStyle>
<scale>1.5</scale>
<Icon>
<href>http://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png</href>
</Icon>
</IconStyle>
</Style>
<Folder><name>city</name>
<Placemark>
<name>Saint Paul</name>
<styleUrl>#custom</styleUrl>
<ExtendedData><SchemaData schemaUrl="#city">
<SimpleData name="city">Saint Paul</SimpleData>
</SchemaData></ExtendedData>
<Point><coordinates>-93.001753817020003,44.96282130428127</coordinates></Point>
</Placemark>
</Folder>
<Schema name="city" id="city">
<SimpleField name="city" type="string"></SimpleField>
</Schema>
</Document></kml>
Вот как выглядит результат (аналогично тому, к чему я стремлюсь):
В rgdal
документации упоминается атрибут layer_options
, но интуитивно ничего не застревает выходи ко мне...
layer_options = c("<name>????</name>")
?layer_options = c("<styleUrl>#custom</styleUrl")
?- Что-то другое?
Приведенные выше попытки передать тег напрямую не влияют на вывод.
В гугле я нашел не так много примеров, кроме создания вывода по умолчанию из writeOGR()
, как показано выше. Спасибо за любые предложения.
kmlPoints(...)
в пакетеmaptools
? Кажется, что это может быть лучше подходит. - person jlhoward   schedule 31.01.2014maptools
, я выполнил то же самое, что и выше, за исключением того, что вместо функцииwriteOGR()
я сделал:kmlPoints(data_ll["city"], kmlfile = "~/Desktop/test.kml", name = data_ll$city, icon = "http://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png")
. Спасибо за предложение! - person Hendy   schedule 01.02.2014