78

@dataデータフレームの対応する属性値に基づいて、SpatialPolygonsDataFrameオブジェクトからいくつかのポリゴンを削除して、簡略化/サブセット化されたシェープファイルをプロットできるようにします。これまでのところ、これを行う方法は見つかりませんでした。

たとえば、面積が30000未満のすべてのポリゴンをこのワールドシェープファイルから削除したいとします。これを行うにはどうすればよいですか?

または、同様に、どうすれば南極大陸を削除できますか?

require(maptools)

getinfo.shape("TM_WORLD_BORDERS_SIMPL-0.3.shp") 
# Shapefile type: Polygon, (5), # of Shapes: 246
world.map <- readShapeSpatial("TM_WORLD_BORDERS_SIMPL-0.3.shp")

class(world.map)
# [1] "SpatialPolygonsDataFrame"
# attr(,"package")
# [1] "sp"

head(world.map@data)
#   FIPS ISO2 ISO3 UN                NAME   AREA  POP2005 REGION SUBREGION     LON     LAT
# 0   AC   AG  ATG 28 Antigua and Barbuda     44    83039     19        29 -61.783  17.078
# 1   AG   DZ  DZA 12             Algeria 238174 32854159      2        15   2.632  28.163
# 2   AJ   AZ  AZE 31          Azerbaijan   8260  8352021    142       145  47.395  40.430
# 3   AL   AL  ALB  8             Albania   2740  3153731    150        39  20.068  41.143
# 4   AM   AM  ARM 51             Armenia   2820  3017661    142       145  44.563  40.534
# 5   AO   AO  AGO 24              Angola 124670 16095214      2        17  17.544 -12.296

このようなことをすると、プロットは変更を反映しません。

world.map@data = world.map@data[world.map@data$AREA > 30000,]
plot(world.map)

これを行うと同じ結果になります。

world.map@data = world.map@data[world.map@data$NAME != "Antarctica",]
plot(world.map)

どんな助けでも大歓迎です!

4

5 に答える 5

74

データを上書きしているように見えますが、ポリゴンは削除されていません。データとポリゴンの両方を含むデータセットを削減したい場合は、たとえば

world.map <- world.map[world.map$AREA > 30000,]
plot(world.map)

[[2016年4月19日編集]]そのソリューションは以前は機能していましたが、 world.map <- world.map[world.map@data$AREA > 30000, ] @ Bonnieは新しいRバージョンについて別の方法で報告します(おそらくデータも変更されていますか?):それが役に立った場合は@Bonnieの回答に賛成してください。

于 2012-11-18T19:31:00.587 に答える
42

R 3.2.1でこれを実行しようとすると、上記のtim riffeの手法は機能しませんでしたが、変更すると問題がわずかに修正されました。以下のように、サブセット化する属性を指定する前に、データスロットも具体的に参照する必要があることがわかりました。

world.map <- world.map[world.map@data$AREA > 30000, ]
plot(world.map)

他の人が同じ問題に遭遇した場合の代替回答としてこれを追加します。

于 2015-08-25T00:04:06.987 に答える
16

言うまでもなくsubset、条件にデータの名前を書き込むことを回避する作業も行われます。

world.map <- subset(world.map, AREA > 30000)
plot(world.map)
于 2016-08-05T15:11:00.043 に答える
11

上記の手法を使用して、オーストラリアだけの地図を作成しました。

australia.map < - world.map[world.map$NAME == "Australia",]
plot(australia.map)

「オーストラリア」の後のコンマは重要です。

この方法の欠点の1つは、他のすべての国のすべての属性列と行を保持しているように見え、それらにゼロを入力するだけであるということです。.shpファイルを書き出してから、readOGR(rgdalパッケージ)を使用して読み戻すと、nullの地理データが自動的に削除されることがわかりました。次に、必要なデータのみを使用して別のシェープファイルを作成できます。

writeOGR(australia.map,".","australia",driver="ESRI Shapefile")
australia.map < - readOGR(".","australia")
writeOGR(australia.map,".","australia_small",driver="ESRI Shapefile")

私のシステムでは、少なくともnullデータを削除するのは「読み取り」関数なので、一度読み取った後でファイルを書き戻す必要があります(ファイル名を再利用しようとすると、エラーが発生します)。もっと簡単な方法があると思いますが、とにかくこれは私の目的には十分に機能しているようです。

于 2013-08-13T01:36:30.243 に答える
1

2番目のポインタとして:これは、インデックスによってサブセット化されているため、シェイプに「穴」があるシェープファイルでは機能しません。

于 2017-01-30T23:20:41.540 に答える