ArcGis 小问题,关于关联和连接的概念!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArcGis 小问题,关于关联和连接的概念!相关的知识,希望对你有一定的参考价值。

请问,表的关联和连接中,所谓的 "一对多",多对一,是什么意思哈?
我的意思的是,不懂,这里的"对"是什么对什么,可以简单举例么?

“一对多”就好像是一个班可以有很多学生,“多对一”就是相反咯。具体到ArcGIS里,就要看你需要建立关系的两个表之间是什么关系了,比如说,你要在“公交站点”和“公交线路”这两个图层之间建立关系类,因为一个公交站点肯定不只一个公交站牌,所以对应多条公交线路,而一条公交线路也不只停一个公交站点,所以两者关系当然是“多对多”。追问

我是说,在属性表中的,1对多是不是"表1"的"字段"对"表2"的"字段"的个数为 "1对多"?还是 一个表对于多一个表?
意思就是说,不懂,在两个"属性表",是属性表中,"比如" 1对多,中,什么对什么...

追答

和表里的字段没有任何关系,判断的是“表1”和“表2”之间的关系。
还是说刚刚那个例子哈,有两张独立的表,一个叫“公交站点”,一个叫“公交线路”,如果我想查询“有哪些公交车经过这个站点”,就需要建立一个关系类,就是把站点和线路“关联”起来。
我们只是单纯的判断“公交站点”和“公交线路”之间是多对多的关系,也就是说“一个站点对应不止一条线路,一条线路对应不止一个站点”。
具体的关联效果就是,当你查询某个“公交站点”的属性的时候,会显示经过该站点的“公交路线”有哪些,而当你查询某条“公交路线”的属性的时候,会显示该路线经过了哪些“公交站点”。

追问

嗯嗯,不是,主要是说到"两个属性表的公共字段定义了两个属性表间的关系."然后我就有点蒙了,但是如果两个层(Laber),我测试的时候,发现如果两个表建立关联的时候,在"Choose the field in this layer that the relate will be based on",选择的字段在"表2"没有该字段,所以对于句子 "两个属性表的公共字段定义了两个属性表间的关系."就不懂什么意思了,请问这是何解呢?谢谢

追答

额。。你是说在ArcMap中的那个”join&relate“啊。。。我还以为是说建立关系类呢。。
当两张表之间是”一对多“或者”多对多“的时候才进行关联,就是”relate“,其他时候是进行合并,就是”join“。怎么判断前面说过了哈。
至于说”两个属性表的公共字段“,并不是说相同的字段名,而是说具有相同的属性类型,比如说都是字符型。也就是说,只要这两张表中有各一个字段,它们存放的数据类型是一样的,就可以进行关联了。

追问

对对,是Join和relate,谢谢大侠很耐心的回答,,还有个问题,就是说,开始您不知道我要问的是join&relate是么,然后你说,一对多,也是那样判断?昨晚一开始我就理解歪了,按你说的,貌似感觉懂多了,因为如果按我开始那样理解,我也觉得矛盾,因为好奇怪的是,一个 layber是 cities,有name属性,一张layber是road,没有name属性,我试着建立cities的字段relate到road,却没有问题,所以当时就蒙了。

追答

“公共字段”不是说有一样的字段名称,而是有一样的属性类型,你点击Properties,然后选到Fields选项卡,里面不是就有这张表的字段么?所谓属性类型就是里面的那个“type”,只要这一项是相同的,就称作是“公共字段”,就可以进行关联了。

参考技术A ArcMap中可以实现属性表的连接与关联,属性数据合并时可以依据字段名称进行,也可以依据空位置进行。当两个属性表中的相关字段具有一对一或多对一关系时,可以应用合并连接操作;当两个属性表中的相关字段具有一对多或多对多关系时,就只能应用关联操作。合并又分为依据公共属性合并属性表和依据空间位置合并属性表。其中有几何位置的数据层数据既可以依据公共属性合并属性表,也可以依据空间位置合并属性表,而纯表格数据只可以依据公共属性合并属性表 参考技术B 链接概念:
链接是指在电子计算机程序的各模块之间传递参数和控制命令,并把它们组成一个可执行的整体的过程。链接也称超级链接,是指从一个网页指向一个目标的连接关系,所指向的目标可以是另一个网页,也可以是相同网页上的不同位置,还可以是图片、电子邮件地址、文件、甚至是应用程序。

关联概念:
指牵连;联系。

mybatis怎么根据id显示两个表的内容连接的小例子都有哪些?

可以通过关系映射查询出来 请看下面

在mybatis中,没有级联的概念,但是可以利用集合来实现类似的功能。
mybatis3.0添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作。因此在进行实体类多对多映射表设计时,需要专门建立一个关联对象类对相关实体类的关联关系进行描述。

插入关联表:
<insert id="insertWife" useGeneratedKeys="true" keyProperty="wid" parameterType="com.cssl.pojo.Wife">
insert into wife (name,h_id) values (#name,#husband.hid)
</insert>

关联映射:嵌入式、继承式 引入式等
先在数据库建立好主外键关系

在xml里面写一个resultMap作为返回类型,如果是多对一 用association 一对多用collection
例子
<!-- 多对一 -->
<resultMap id="wifeandhusband" type="wife">
<id property="wid" column="wid"></id>
<result property="wname" column="wname"></result>
<association property="husband" column="w_hid" javaType="com.cssl.pojo.Husband">
<id property="hid" column="hid"></id>
<result property="name" column="name"></result>
</association>
</resultMap>

<!-- 一对多 -->
<resultMap id="husbandandwife" type="com.cssl.pojo.Husband">
<id property="hid" column="hid"></id>
<result property="name" column="name"></result>
<collection property="wifes" ofType="wife"> --ofType集合中的类型
<id property="wid" column="wid"></id>
<result property="wname" column="wname"></result>
</collection>
</resultMap>

<select id="selectWife" resultMap="wifeandhusband">
select w.*,h.* from wife w left join husband h on w.h_id=h.hid
</select>

注意:
1、关联查询一定要带有关联对象的id(主外键),否则集合只会有一条记录存在(认为你查询的是一个对象)
如:
select h.name,h.age,w.wname from wife w left join husband h on h.hid=w.h_id

2、表连接中不同表有同名字段的时候:a和b都有name字段
<resultMap type="b" id="b">
<id property="bid" column="id"/>
<result property="name" column="name"/>
<association property="a" javaType="a">
<id property="aid" column="aid"/>
<result property="name" column="aname"/>
</association>
</resultMap>

<select id="select" resultMap="b">
select a.id aid,a.name aname,b.id,b.name from a,b where a.id=b.id
</select>
参考技术A

mybits是支持普通sql查询、存储过程和高级映射的持久层框架

几乎消除了所有的jdbc代码和参数设置以及对结果集检索封装

可用xml或注解二种方式配置

jdbc->dbUtil(自动封装结果集)->mybatis->hibernate(面向对象的操作)

一个简单的mybatis例子(根据id查数据)

1.添加mybatis和mysql的jar包,在数据库中建立一个表如:user表

2.编写mybaits的config.xml

可从文档中copy

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<environments default="development">

<environment id="development">

<transactionManager type="JDBC" /> 

<dataSource type="POOLED">

<property name="driver" value="com.mysql.jdbc.Driver" />

<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />

<property name="username" value="root" />

<property name="password" value="123" />

</dataSource>

</environment>

</environments>

</configuration>

3.建立表相应的实体类,如:user

4.建立user的映射文件userMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.mybits_01.test1.userMapper">

<select id="getUser" parameterType="int"

resultType="com.mybits_01.test1.User">

select * from users where id=#id

</select>

</mapper>

5.在config.xml中注册userMapper.xml文件

<mappers>

<mapper resource="com/mybits_01/test1/userMapper.xml"/>

</mappers>

6.插曲:如果没有标签提示,可能没有导入dtd文件,在Eclipse中的window下打开preferences搜索xml在xml下的xml catalog里点击add出现如图:

指定一个public id 如

中的-//mybatis.org//DTD Config 3.0//EN

而location则是dtd文件所在位置就可以了

7.测试

public static void main(String[] args) throws IOException

String resource = "conf.xml";

InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

SqlSession session = factory.openSession();

String statement = "com.mybits_01.test1.userMapper.getUser";

User user = session.selectOne(statement,1);

System.out.println(user);

参考技术B 可以通过关系映射查询出来 请看下面

在mybatis中,没有级联的概念,但是可以利用集合来实现类似的功能。
mybatis3.0添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作。因此在进行实体类多对多映射表设计时,需要专门建立一个关联对象类对相关实体类的关联关系进行描述。

插入关联表:
<insert id="insertWife" useGeneratedKeys="true" keyProperty="wid" parameterType="com.cssl.pojo.Wife">
insert into wife (name,h_id) values (#name,#husband.hid)
</insert>

关联映射:嵌入式、继承式 引入式等
先在数据库建立好主外键关系

在xml里面写一个resultMap作为返回类型,如果是多对一 用association 一对多用collection
例子
<!-- 多对一 -->
<resultMap id="wifeandhusband" type="wife">
<id property="wid" column="wid"></id>
<result property="wname" column="wname"></result>
<association property="husband" column="w_hid" javaType="com.cssl.pojo.Husband">
<id property="hid" column="hid"></id>
<result property="name" column="name"></result>
</association>
</resultMap>

<!-- 一对多 -->
<resultMap id="husbandandwife" type="com.cssl.pojo.Husband">
<id property="hid" column="hid"></id>
<result property="name" column="name"></result>
<collection property="wifes" ofType="wife"> --ofType集合中的类型
<id property="wid" column="wid"></id>
<result property="wname" column="wname"></result>
</collection>
</resultMap>

<select id="selectWife" resultMap="wifeandhusband">
select w.*,h.* from wife w left join husband h on w.h_id=h.hid
</select>

注意:
1、关联查询一定要带有关联对象的id(主外键),否则集合只会有一条记录存在(认为你查询的是一个对象)
如:
select h.name,h.age,w.wname from wife w left join husband h on h.hid=w.h_id

2、表连接中不同表有同名字段的时候:a和b都有name字段
<resultMap type="b" id="b">
<id property="bid" column="id"/>
<result property="name" column="name"/>
<association property="a" javaType="a">
<id property="aid" column="aid"/>
<result property="name" column="aname"/>
</association>
</resultMap>

<select id="select" resultMap="b">
select a.id aid,a.name aname,b.id,b.name from a,b where a.id=b.id
</select>

以上是关于ArcGis 小问题,关于关联和连接的概念!的主要内容,如果未能解决你的问题,请参考以下文章

关于SocialExplorer.IO.FastDBF库读写ArcGis dbf文件的两个小bug

arcgis中属性表怎么关联之后保留多条记录

mybatis怎么根据id显示两个表的内容连接的小例子都有哪些?

arcgis中得融合问题,碎小图版之间的融合?

arcgis中的一个feature中,怎样在两个空间上存在包含关系的多边形中选取较大的一个?

arcgis关联数据,关联后数据怎么变成了字母