Помощь с ‹name› и ‹styleUrl› в .kml при использовании writeOGR() из rgdal

У меня есть фрейм данных, содержащий координаты различных мест, которые я хотел бы использовать с 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(), как показано выше. Спасибо за любые предложения.


person Hendy    schedule 31.01.2014    source источник
comment
Пробовали ли вы kmlPoints(...) в пакете maptools? Кажется, что это может быть лучше подходит.   -  person jlhoward    schedule 31.01.2014
comment
@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"). Спасибо за предложение!   -  person Hendy    schedule 01.02.2014


Ответы (2)


Чтобы расширить ответ @jlhoward выше, я смог использовать kmlPoints() для выполнения того, что искал:

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

# you may need to install gdal itself for the package to install successfully
# install.packages("rgdal")
library(rgdal)
library(maptools)

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"))

kmlPoints(data_ll["city"], kmlfile = "~/Desktop/test.kml",
          name = data_ll$city,
          icon = "http://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png")

Выходные данные содержат как требуемый атрибут <name>, так и определение <Style> для пользовательского значка, которое успешно применяется к записям <Placemark>:

readLines("test.kml")

 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>"                                                                
 [5] "<description><![CDATA[]]></description>"                                      
 [6] ""                                                                             
 [7] "<Style id=\"style1\">"                                                        
 [8] "  <IconStyle>"                                                                
 [9] "    <Icon>"                                                                   
[10] "      <href>http://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png</href>"
[11] "    </Icon>"                                                                  
[12] "  </IconStyle>"                                                               
[13] "</Style>"                                                                     
[14] ""                                                                             
[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>"  

Результат:

введите здесь описание изображения

person Hendy    schedule 31.01.2014

Ну, если все, что вы хотите сделать, это заполнить элемент <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.

person jlhoward    schedule 31.01.2014
comment
Ха! Мы публиковали одновременно. Если вы запустите свой код и просто добавите аргумент icon = "http://path..." к команде, вы также получите добавленные значки, с бонусом в том, что он сгенерирует их как стиль и применит (против моего предположения, что он, вероятно, добавит <Style> тег к каждому <Placemark>, См. Мой комментарий к вопросу для полной команды, если вы хотите обновить свой ответ. - person Hendy; 01.02.2014
comment
Если у вас есть более полный ответ, вы должны опубликовать его с примером вывода (например, чем отличается kml). Нет ничего плохого в том, чтобы использовать чужой ответ, чтобы сделать его лучше. - person jlhoward; 01.02.2014