Docs in progress for 'QGIS testing'. Visit https://docs.qgis.org/3.4 for QGIS 3.4 docs and translations.
应该有9个字段 rivers 层:
小技巧
一个更快的方法是双击 rivers 层,打开 选项卡,从中可以找到表字段的编号列表。
有关城镇的信息可在 places 层。打开其属性表,就像使用 rivers 层:有两个功能 place 属性设置为 town
: Swellendam 和 BuffelJagsrivier公司. 如果愿意,您可以在这两个记录的其他字段上添加注释。
你的地图应该有七层:
training_data.gpkg
) andexercise_data/shapefile
).您的地图现在应该如下所示:
如果你是一个初学者,你可以在这里停留。
要制作所需的符号,需要三个符号层:
最低的符号层是一条宽而实的灰色线。在它上面有一条稍细的实心黄线,最后是另一条稍细的实心黑线。
如果符号层与上面类似,但没有得到所需的结果:
检查您的符号级别是否如下所示:
现在,您的地图应该如下所示:
以下是符号结构的示例:
这个 name
字段是显示为标签最有用的字段。这是因为它的所有值对于每个对象都是唯一的,并且不太可能包含 NULL 价值观。如果您的数据包含 NULL 价值观,只要你的大部分地方都有名字就不用担心。
一种可能的解决方案是最终产品:
要得到这个结果:
使用的字体大小为 10
,A Label distance 属于 1,5 mm
, Symbol width 和 Symbol size 属于 3.0 mm
.
此外,此示例使用 Wrap label on character 选项:
输入一个 space
在此字段中单击 Apply 达到同样的效果。在我们的例子中,一些地名非常长,导致名称带有多行,这对用户不太友好。您可能会发现此设置更适合您的地图。
仍处于编辑模式,设置 FONT_SIZE
价值观。示例使用 16
城镇, 14
郊区, 12
对于地方和 10
为了哈姆雷特。
记住保存更改并退出编辑模式。
返回到 Text 的格式选项 places 图层和选择 FONT_SIZE
在 Attribute field 字体大小数据覆盖下拉列表:
如果使用上述值,您的结果应该是:
使用与本课第一个练习中相同的方法清除边界:
您使用的设置可能不相同,但具有值 Classes = 6
和 Mode = Natural Breaks (Jenks) (当然,使用相同的颜色),地图将如下所示:
1
作为属性的源(单击对话框中的条目,然后单击 Take attributes from selected feature 按钮:注解
1
. 只需选择具有 OGC_FID .注解
使用 Merge Attributes of Selected Features 工具将保持几何图形的不同,但赋予它们相同的属性。
对于 TYPE ,显然,道路的类型数量是有限的,如果检查此层的属性表,您将看到它们是预定义的。
将小部件设置为 Value Map 然后点击 Load Data from Layer .
选择 roads 在 Label 下拉和 highway 对于两者 Value 和 Description 选项:
点击 Ok 三次。
如果您使用 Identify 当编辑模式处于活动状态时,街道上的工具,您得到的对话框应该如下所示:
缓冲区对话框应如下所示:
这个 Buffer distance 是 1 公里。
这个 Segments to approximate 值设置为 20 . 这是可选的,但建议这样做,因为这样可以使输出缓冲区看起来更平滑。比较一下:
对此:
第一个图像显示的缓冲区 Segments to approximate 值设置为 5 第二个显示的值设置为 20 . 在我们的示例中,差异很小,但是您可以看到缓冲区的边缘随着值的增大而变得更平滑。
创建新的 houses_restaurants_500m 层,我们经历了两个步骤:
首先,在餐厅周围创建一个500米的缓冲区,并将该层添加到地图中:
接下来,提取缓冲区内的建筑:
您的地图现在只应显示道路50米范围内、学校1公里范围内和餐馆500米范围内的建筑物:
正常开放
并将对话框填充为:确保 Path type to calculate 是 Fastest
.
点击 Run 然后关闭对话框。
现在打开输出层的属性表。这个 cost 字段包含两点之间的行程时间(以小时为单位):
设置你的 Raster calculator 像这样对话:
对于5度版本,更换 2
在表达式和文件名中 5
.
你的结果:
2度:
5度:
"suitable" = 1
.在原始栅格上查看时,区域应完全重叠:
你可能会注意到 new_solution
层被 Intersect 工具。这表明,建筑的一部分——因此只有部分财产——位于合适的地形上。因此,我们可以明智地从数据集中删除这些建筑
目前,您的分析应该如下所示:
考虑一个圆形区域,在各个方向上连续100米。
如果半径大于100米,那么从它的尺寸减去100米(从所有方向)将导致它的一部分留在中间。
因此,您可以运行 interior buffer 你现有的100米 suitable_terrain 矢量层。在缓冲功能的输出中,原始层的剩余部分将表示100米以外有合适地形的区域。
证明:
去
打开缓冲区对话框。设置如下:
使用 suitable_terrain 层带 10
段和缓冲距离 -100
. (距离自动以米为单位,因为您的地图使用投影的CRS。)
将输出保存在 exercise_data/residential_development/
作为 suitable_terrain_continuous100m.shp
.
如有必要,将新层移动到原始层之上 suitable_terrain
层。
您的结果如下所示:
现在使用 Select by Location 工具(工具) )
设置如下:
在中选择功能 new_solution 与中的特征相交 suitable_terrain_continuous100m.shp .
结果是:
选择黄色建筑。尽管有些建筑部分落在新建筑外面 suitable_terrain_continuous100m
层,它们很好地位于原始 suitable_terrain
层,因此满足我们的所有要求。
exercise_data/residential_development/
作为 final_answer.shp
.使用与之前相同的方法添加新服务器和托管在该服务器上的相应层:
如果你放大 Swellendam 区域,您会注意到此数据集的分辨率较低:
因此,最好不要将此数据用于当前地图。蓝色大理石数据更适合全球或国家范围。
您可能会注意到许多WMS服务器并不总是可用的。有时这是暂时的,有时是永久的。在编写时工作的WMS服务器的一个示例是 World Mineral Deposits WMS网址:http://apps1.gdr.nrcan.gc.ca/cgi-bin/worldmin_en-ca_ws。它不需要费用或访问限制,而且是全球性的。因此,它确实满足了要求。不过,请记住,这只是一个例子。还有许多其他的WMS服务器可供选择。
通过在浏览器中拖放图层(请参见),可以将图层(矢量和栅格)添加到草地地图集中。 Follow Along: Load data using the QGIS Browser )或者使用 v.in.gdal.qgis
向量和 r.in.gdal.qgis
用于栅格图层。
要发现栅格的最大值,请运行 r.info
工具:在控制台中,您将看到最大值为1699。
您现在可以编写规则了。打开文本编辑器并添加以下规则:
0 thru 1000 = 1
1000 thru 1400 = 2
1400 thru 1699 = 3
将文件另存为 my_rules.txt
文件并关闭文本编辑器。
运行 r.reclass
工具,选择 g_dem
分层并加载包含刚刚保存的规则的文件。
点击 Run 然后在 View Output . 您可以更改颜色,最终结果应如下图所示:
对于我们的理论地址表,我们可能需要存储以下属性:
House Number
Street Name
Suburb Name
City Name
Postcode
Country
在创建表以表示地址对象时,我们将创建列来表示这些属性中的每一个,并将它们命名为与SQL兼容的、可能是缩写的名称:
house_number
street_name
suburb
city
postcode
country
主要问题是 people 表中有一个地址字段,其中包含一个人的整个地址。思考我们的理论 address 在本课前面的表中,我们知道地址由许多不同的属性组成。通过将所有这些属性存储在一个字段中,我们使得更新和查询数据变得更加困难。因此,我们需要将地址字段拆分为各种属性。这将为我们提供一个具有以下结构的表:
id | name | house_no | street_name | city | phone_no
--+---------------+----------+----------------+------------+-----------------
1 | Tim Sutton | 3 | Buirski Plein | Swellendam | 071 123 123
2 | Horst Duester | 4 | Avenue du Roix | Geneva | 072 121 122
注解
在下一节中,您将了解外键关系,该关系可在本示例中用于进一步改进数据库的结构。
我们的 people 表当前如下所示:
id | name | house_no | street_id | phone_no
---+--------------+----------+-----------+-------------
1 | Horst Duster | 4 | 1 | 072 121 122
这个 street_id
列表示 people 对象和相关 street 对象,位于 streets
进一步使表正常化的一种方法是将名称字段拆分为 first_name 和 last_name: :
id | first_name | last_name | house_no | street_id | phone_no
---+------------+------------+----------+-----------+------------
1 | Horst | Duster | 4 | 1 | 072 121 122
我们还可以为城镇或城市名称和国家创建单独的表,将它们与我们的 people 通过“一对多”关系的表:
id | first_name | last_name | house_no | street_id | town_id | country_id
---+------------+-----------+----------+-----------+---------+------------
1 | Horst | Duster | 4 | 1 | 2 | 1
表示这一点的ER图如下所示:
创建正确的人员表所需的SQL是::
create table people (id serial not null primary key,
name varchar(50),
house_no int not null,
street_id int not null,
phone_no varchar null );
表的架构(输入 \d people
)如下所示:
Table "public.people"
Column | Type | Modifiers
-----------+-----------------------+-------------------------------------
id | integer | not null default
| | nextval('people_id_seq'::regclass)
name | character varying(50) |
house_no | integer | not null
street_id | integer | not null
phone_no | character varying |
Indexes:
"people_pkey" PRIMARY KEY, btree (id)
注解
为了便于说明,我们故意省略了fkey约束。
在这种情况下,drop命令不起作用的原因是 people 表对具有外键约束 streets 表。这意味着删除 streets 桌子会离开 people 引用不存在的表 streets 数据。
注解
可以“强制”的 streets 要删除的表,请使用 CASCADE 命令,但这也会删除 people 以及任何其他与 streets 表。小心使用!
您应该使用的SQL命令如下(您可以用您选择的名称替换街道名称)::
insert into streets (name) values ('Low Road');
下面是正确的SQL语句:
insert into streets (name) values('Main Road');
insert into people (name,house_no, street_id, phone_no)
values ('Joe Smith',55,2,'072 882 33 21');
如果您再次查看streets表(使用前面的select语句),您将看到 id
对于 Main Road
条目是 2
.
这就是为什么我们只能输入数字的原因 2
上面。即使我们没有看到 Main Road
完全写在上面的条目中,数据库将能够将其与 street_id
价值 2
.
注解
如果您已经添加了新的 street
对象,您可能会发现 Main Road
有身份证 3
不 2
.
下面是您应该使用的正确SQL语句::
select count(people.name), streets.name
from people, streets
where people.street_id=streets.id
group by streets.name;
结果:
count | name
------+-------------
1 | Low Street
2 | High street
1 | Main Road
(3 rows)
注解
您会注意到我们在字段名前面加了表名(例如people.name和streets.name)。只要字段名不明确(即数据库中的所有表都不是唯一的),就需要执行此操作。
示例查询使用的单位是度,因为层使用的CRS是wgs 84。这是一个地理CRS,也就是说它的单位是度。与UTM投影一样,投影的CRS以米为单位。
记住,编写查询时,需要知道层的CRS在哪个单元中。这将允许您编写一个返回预期结果的查询。
CREATE INDEX cities_geo_idx
ON cities
USING gist (the_geom);
alter table streets add column the_geom geometry;
alter table streets add constraint streets_geom_point_chk check
(st_geometrytype(the_geom) = 'ST_LineString'::text OR the_geom IS NULL);
insert into geometry_columns values ('','public','streets','the_geom',2,4326,
'LINESTRING');
create index streets_geo_idx
on streets
using gist
(the_geom);
delete from people;
alter table people add column city_id int not null references cities(id);
(在qgis中捕获城市)
insert into people (name,house_no, street_id, phone_no, city_id, the_geom)
values ('Faulty Towers',
34,
3,
'072 812 31 28',
1,
'SRID=4326;POINT(33 33)');
insert into people (name,house_no, street_id, phone_no, city_id, the_geom)
values ('IP Knightly',
32,
1,
'071 812 31 28',
1,F
'SRID=4326;POINT(32 -34)');
insert into people (name,house_no, street_id, phone_no, city_id, the_geom)
values ('Rusty Bedsprings',
39,
1,
'071 822 31 28',
1,
'SRID=4326;POINT(34 -34)');
如果您收到以下错误消息:
ERROR: insert or update on table "people" violates foreign key constraint
"people_city_id_fkey"
DETAIL: Key (city_id)=(1) is not present in table "cities".
这意味着,在尝试为“城市”表创建多边形时,必须删除其中一些多边形,然后重新开始。只需检查城市表中的条目并使用 id
它存在。
create table cities (id serial not null primary key,
name varchar(50),
the_geom geometry not null);
alter table cities
add constraint cities_geom_point_chk
check (st_geometrytype(the_geom) = 'ST_Polygon'::text );
insert into geometry_columns values
('','public','cities','the_geom',2,4326,'POLYGON');
select people.name,
streets.name as street_name,
st_astext(people.the_geom) as geometry
from streets, people
where people.street_id=streets.id;
结果:
name | street_name | geometry
--------------+-------------+---------------
Roger Jones | High street |
Sally Norman | High street |
Jane Smith | Main Road |
Joe Bloggs | Low Street |
Fault Towers | Main Road | POINT(33 -33)
(5 rows)
如您所见,我们的约束允许将空值添加到数据库中。