2014-01-31 6 views
0

У меня есть кадр данных, содержащий координаты в разных местах, которые я хотел бы использовать с Google Earth. Вот простой пример, показывающий структуру:Помощь с <name> и <styleUrl> в .kml при использовании writeOGR() от rgdal

data <- data.frame(country = "USA", city = "Saint Paul", 
        lat = 44.9629, lon = -93.00146) 

Я последовал this SO post и this guide создать 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 Earth показывает местоположения с [no name] атрибута:

enter image description here

Вот результирующий .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> 

Вот что результат выглядит (по аналогии с тем, что я м стремится к):

enter image description here

rgdal documentation упоминает атрибут layer_options, но ничего не интуитивно торчала ко мне ...

  • layer_options = c("<name>????</name>")?
  • layer_options = c("<styleUrl>#custom</styleUrl")?
  • Что-то еще?

Попытки передать тег непосредственно не влияют на выход.

Существует не так много примеров, которые я нашел в googling, кроме создания вывода по умолчанию от writeOGR(), как показано выше. Спасибо за любые предложения.

+1

Вы пробовали 'kmlPoints (...)' в пакете ['maptools'] (http://cran.r-project.org/web/packages/maptools/maptools.pdf)? Похоже, что это лучше подходит. – jlhoward

+0

@jlhoward Нет, но только что сделал, и он действительно работает. Я хотел бы оставить вопрос открытым для ответов, поскольку он может представлять интерес для других пользователей. Для тех, кто хочет использовать «maptools», я выполнил все вышеперечисленное точно, за исключением функции 'writeOGR()', я сделал: 'kmlPoints (data_ll [" city "], kmlfile =" ~/Desktop/test. kml ", name = data_ll $ city, icon =" http://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png ")'. Спасибо за предложение! – Hendy

ответ

1

Ну, если все, что вы хотите сделать, это заполнить <name> элемент в каждом <Placemark>, это будет сделать это:

library(maptools) 
kmlPoints(data_ll,"test.kml",name=data$city) 
readLines("test.kml") 
# [1] "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"        
# [2] "<kml xmlns=\"http://earth.google.com/kml/2.2\">"       
# [3] "<Document>"                
# [4] "<name></name>"               
# ... 
# [15] "<Placemark>"                
# [16] " <name>Saint Paul</name>"            
# [17] " <description><![CDATA[]]></description>"        
# [18] " <styleUrl>#style1</styleUrl>"           
# [19] " <Point>"                
# [20] " <coordinates>"              
# [21] "-93.00175381702,44.9628213042813"           
# [22] " </coordinates>"              
# [23] " </Point>"                
# [24] "</Placemark>"                
# [25] "</Document>"                
# [26] "</kml>"                 

Если вам нужно изменить <Style>, а также, то я Боюсь, вам, возможно, придется взломать файл kml, используя пакет XML.

+1

Ха! Мы отправляли в то же время. Если вы запустите свой код и просто добавьте в команду аргумент 'icon =" http: // path ... "', вы также получите значки, с бонусом его создания в качестве стиля и применения он (по сравнению с моим предположением, что он, вероятно, добавит тег '