`

今天去 海图 买了本 mongodb 权威指南

阅读更多

今天去 海图 买了本 mongodb 权威指南 ....

 

 

好热啊 好困啊 .... 睡觉去了... 晚上再看....

 

谁有分布式应用 开发的 demo 或者文档 能给我发点不...

 

前天下午与 昨天 跑了2次 动物园 海洋馆 .....

 

累 啊  小孩却很 精神 ...... 难过

1
4
分享到:
评论
6 楼 vb2005xu 2011-06-07  
http://code.google.com/p/redis/

http://wenku.baidu.com/view/a770f6878762caaedd33d4ff.html

http://developer.51cto.com/art/201104/255093.htm
5 楼 vb2005xu 2011-06-06  
引用

Mongoose – 让NodeJS更容易操作Mongodb数据库
Mongoose是什么

Mongoose是MongoDB的一个对象模型工具,可以工作于异步环境下。

定义一个模型很容易:

var Comments = new Schema({
    title     : String
  , body      : String
  , date      : Date
});

var BlogPost = new Schema({
    author    : ObjectId
  , title     : String
  , body      : String
  , date      : Date
  , comments  : [Comments]
  , meta      : {
        votes : Number
      , favs  : Number
    }
});

mongoose.model('BlogPost', BlogPost);

安装

推荐通过NPM方式安装:

$ npm install mongoose

或者,你可以从Github仓库中获取代码,然后解压:

$ git clone git@github.com:LearnBoost/mongoose.git support/mongoose/

// 将模块添加至NodeJS可以找到的环境路径中
require.paths.unshift('support/mongoose/lib');

然后就可以在应用中将mongoose模块包含进来

require('mongoose');

连接到MongoDB数据库

首先,我们需要定义一个连接。如果你的应用只使用一个数据库,可以使用mongoose.connect,如果需要创建附加数据库连接,使用mongoose.createConnection。

connect和createConnection都能连接mongodb数据库,支持以URI或参数(host,database,port)的形式。

var mongoose = require('mongoose');
mongoose.connect('mongodb://www.csser.com/csser.com_database');

连接一旦建立成功,该连接实例的open事件就被触发。如果你使用的是mongoose.connect方式,连接对象为mongoose.connection;否则,mongoose.createConnection返回的是Connection对象。

切记!Mongoose在与数据库真正建立连接之前便缓存了所有的命令,这就意味着你在定义模型、执行查询时不必非要确认与MongoDB数据库的连接是否已经建立。(一回@CSSer注:异步是MongoDB等与传统数据库的重大区别)
定义模型

模型是通过模式接口(Schema interface)定义的,如:

var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectId;

var BlogPost = new Schema({
    author    : ObjectId
  , title     : String
  , body      : String
  , date      : Date
});

除了定义文档结构和你要存储的数据类型外,模式(Schema)还用于以下定义:

    * Validators (异步和同步)
    * Defaults – 默认值
    * Getters
    * Setters
    * Indexes – 索引
    * Middleware – 中间件
    * Methods definition – 方法定义
    * Statics definition – 静态定义
    * Plugins – 插件

下面的代码向我们展示了这些功能的一部分:

var Comment = new Schema({
    name  :  { type: String, default: 'hahaha' }
  , age   :  { type: Number, min: 18, index: true }
  , bio   :  { type: String, match: /[a-z]/ }
  , date  :  { type: Date, default: Date.now }
});

// 定义setter
Comment.path('name').set(function (v) {
  return v.capitalize();
});

// 定义中间件
Comment.pre('save', function (next) {
    notify(this.get('email'));
    next();
});

你可以查看几乎包含所有模型定义的示例。
访问模型

当通过mongoose.model(‘ModelName’, mySchema)定义了一个模型之后,我们可以通过相同的函数来访问它:

var myModel = mongoose.model('ModelName');

接下来我们可以将模型的实例保存下来:

var instance = new myModel();
instance.my.key = 'csser';
instance.save(function (err) {
  //
});

或者我们也可以从同样的的集合(collection)中找到文档(documents):

myModel.find({}, function (err, docs) {
  // docs.forEach
});

也可以调用findOne, findById, update等等方法,更多的细节请阅读API文档。
嵌入文档

还记得在第一个示例的代码片段中,我们在模式中定义了一个键(key):

comments: [Comments]

这里的Comments是我们已经创建的模式(Schema),这就是说创建嵌入文档跟下面的代码看起来一样简单:

// 重新获得模型
var BlogPost = mongoose.model('BlogPost');

// 创建一篇博客日志
var post = new BlogPost();

// 创建一个评论
post.comments.push({ title: 'My comment for csser.com' });

post.save(function (err) {
  if (!err) console.log('Success!');
});

用同样的方式删除模式:

BlogPost.findById(myId, function (err, post) {
  if (!err) {
    post.comments[0].remove();
    post.save(function (err) {
      // do something
    });
  }
});

嵌入文档拥有与模型相同的功能,包括Defaults、validators、middleware等。当发生错误时,它会冒泡到save()错误回调函数,这里错误处理是一个单元。

Mongoose interacts with your embedded documents in arrays atomically, out of the box.
中间件

中间件是Mongoose 1.0推出的最激动人心的功能之一,它让我们可以不用再受嵌套回调函数的折磨了。

中间件定义在模式级别(Schema level),当方法初始化时(文档与MongoDB数据初始化后)、保存数据时(文档或嵌入文档保存后)生效。

中间件有两种类型,它们由定义的函数签名确定(即函数接受的参数)。

顺序(Serial)中间件定义如下:

  .pre(method, function (next) {
    // ...
  })

当每个中间件调用下一个时,它们按顺序执行。

并行(Parallel)中间件提供更细粒度的控制,其定义如下:

  .pre(method, function (next, done) {
    // ...
  })

Parallel 中间件可以立刻next(),但是只有当所有parallel中间件调用done()之后最后的参数才被执行。
错误处理

如果任一个中间件调用next或done时抛出了错误,执行流会中断,错误会被作为参数传入回调函数。

例如:

schema.pre('save', function (next) {
    // 发生了一些错误
    next(new Error('有错误发生'));
});

// 接着...

myModel.save(function (err) {
  // 错误可以来自某个中间件
});

4 楼 vb2005xu 2011-06-06  
http://howtonode.org/express-mongodb nodejs 与 mondb 已经 express 框架的集成
3 楼 vb2005xu 2011-06-06  
nodejs 与 mongodb 的样例

var http = require("http"),
  mongo = require("mongodb"),
  events = require("events");
 
http.createServer(function(req, res) {
 
  var products_emitter = new events.EventEmitter(),
      // 创建到northwind数据库的链接。相当于use northwind
      db = new mongo.Db("northwind", new mongo.Server('localhost', 27017, {}), {});
 
  var listener = function(products) {
      var html = [], len = products.length;
      html.push('<!DOCTYPE html>');
      html.push('<html>');
      html.push('<head>');
      html.push('<title>Nodejs</title>');
      html.push('</head>');
      html.push('<body>');
      if(len > 0) {
        html.push('<ul>');
        for(var i = 0; i < len; i++) {
          html.push('<li>' + products[i].name + '</li>');
        }
        html.push('</ul>');
      }
      html.push('</body>');
      html.push('</html>');
 
      res.writeHead(200, "Content-Type: text/html");
      res.write(html.join(''));
      res.end();
 
      clearTimeout(timeout);
  }
  products_emitter.on('products', listener);
 
  var timeout = setTimeout(function() {
      products_emitter.emit('products', []);
      products_emitter.removeListener('products', listener);
  }, 10000);
 
  db.open(function() {
      // 打开名为products的表
    db.collection("products", function(err, collection) {
        // select * from products 相当于db.products.find()
      collection.find(function(err, cursor) {
        cursor.toArray(function(err, items) {
          products_emitter.emit('products', items);
        });
      });
    });
  });
 
}).listen(8000);
 
console.log("Started");
2 楼 vb2005xu 2011-06-06  
http://www.mongodb.org/pages/viewpage.action?pageId=5079170
中文手册
1 楼 vb2005xu 2011-06-06  
http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html

基本手册:

mongoDB 入门指南、示例
上一篇:简单介绍mongoDB


一、准备工作

1、 下载mongoDB

下载地址:http://www.mongodb.org/downloads

选择合适你的版本

相关文档:http://www.mongodb.org/display/DOCS/Tutorial

2、 安装mongoDB

A、 不解压模式:

将下载下来的mongoDB-xxx.zip打开,找到bin目录,运行mongod.exe就可以启动服务,默认端口27017,db保存的路径是系统C 硬盘目录的根目录的/data/db目录。也就是说,如果你的mongoDB-xxx.zip在E盘,那么你需要在C盘下建立data/db目录。 mongoDB不会帮你建立这个目录的。

然后运行mongo即可连接到test数据库,你就可以进行数据操作。运行help显示帮助命令行。

B、 解压模式

将下载下来的mongoDB-xxx.zip解压到任意目录,找到bin目录,运行mongod.exe就可以启动mongoDB,默认端口 27017,db保存的路径是当前zip所在硬盘目录的根目录的/data/db目录。也就是说,如果你的mongoDB-xxx.zip在E盘,那么你需要在E盘下建立data/db目录。mongoDB不会帮你建立这个目录的。

然后运行mongo即可连接到test数据库,你就可以进行数据操作。运行help显示帮助命令行。

3、 简单测试

> 2+4

6

> db

test

> //第一次插入数据会创建数据库

Fri May 20 16:47:39 malformed UTF-8 character sequence at offset 27

error2:(shellhelp1) exec failed: malformed UTF-8 character sequence at offset 27

> db.foo.insert({id: 2011, userName: 'hoojo', age: 24, email: "hoojo_@126.com"});

> db.foo.find();

{ "_id" : ObjectId("4dd62b0352a70cbe79e04f81"), "id" : 2011, "userName" : "hoojo",

"age" : 24, "email" : "hoojo_@126.com" }

>

上面完成了简单运算,显示当前使用的数据库,以及添加数据、查询数据操作


二、DB shell数据操作

shell命令操作语法和JavaScript很类似,其实控制台底层的查询语句都是用JavaScript脚本完成操作的。

Ø 数据库



1、Help查看命令提示

help

db.help();

db.yourColl.help();

db.youColl.find().help();

rs.help();



2、切换/创建数据库

>use yourDB;

当创建一个集合(table)的时候会自动创建当前数据库



3、查询所有数据库

show dbs;



4、删除当前使用数据库

db.dropDatabase();



5、从指定主机上克隆数据库

db.cloneDatabase(“127.0.0.1”);

将指定机器上的数据库的数据克隆到当前数据库



6、从指定的机器上复制指定数据库数据到某个数据库

db.copyDatabase("mydb", "temp", "127.0.0.1");

将本机的mydb的数据复制到temp数据库中



7、修复当前数据库

db.repairDatabase();



8、查看当前使用的数据库

db.getName();

db;

db和getName方法是一样的效果,都可以查询当前使用的数据库



9、显示当前db状态

db.stats();



10、当前db版本

db.version();



11、查看当前db的链接机器地址

db.getMongo();

Ø Collection聚集集合



1、创建一个聚集集合(table)

db.createCollection(“collName”, {size: 20, capped: 5, max: 100});



2、得到指定名称的聚集集合(table)

db.getCollection("account");



3、得到当前db的所有聚集集合

db.getCollectionNames();



4、显示当前db所有聚集索引的状态

db.printCollectionStats();

Ø 用户相关

1、添加一个用户

db.addUser("name");

db.addUser("userName", "pwd123", true);

添加用户、设置密码、是否只读



2、数据库认证、安全模式

db.auth("userName", "123123");



3、显示当前所有用户

show users;



4、删除用户

db.removeUser("userName");

Ø 其他

1、查询之前的错误信息

db.getPrevError();



2、清除错误记录

db.resetError();


三、Collection聚集集合操作

Ø 查看聚集集合基本信息



1、查看帮助

db.yourColl.help();



2、查询当前集合的数据条数

db.yourColl.count();



3、查看数据空间大小

db.userInfo.dataSize();



4、得到当前聚集集合所在的db

db.userInfo.getDB();



5、得到当前聚集的状态

db.userInfo.stats();



6、得到聚集集合总大小

db.userInfo.totalSize();



7、聚集集合储存空间大小

db.userInfo.storageSize();



8、Shard版本信息

db.userInfo.getShardVersion()



9、聚集集合重命名

db.userInfo.renameCollection("users");

将userInfo重命名为users



10、删除当前聚集集合

db.userInfo.drop();

Ø 聚集集合查询

1、查询所有记录

db.userInfo.find();

相当于:select * from userInfo;

默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”

但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize = 50;这样每页就显示50条记录了。



2、查询去掉后的当前聚集集合中的某列的重复数据

db.userInfo.distinct("name");

会过滤掉name中的相同数据

相当于:select distict name from userInfo;



3、查询age = 22的记录

db.userInfo.find({"age": 22});

相当于: select * from userInfo where age = 22;



4、查询age > 22的记录

db.userInfo.find({age: {$gt: 22}});

相当于:select * from userInfo where age > 22;



5、查询age < 22的记录

db.userInfo.find({age: {$lt: 22}});

相当于:select * from userInfo where age < 22;



6、查询age >= 25的记录

db.userInfo.find({age: {$gte: 25}});

相当于:select * from userInfo where age >= 25;



7、查询age <= 25的记录

db.userInfo.find({age: {$lte: 25}});



8、查询age >= 23 并且 age <= 26

db.userInfo.find({age: {$gte: 23, $lte: 26}});



9、查询name中包含 mongo的数据

db.userInfo.find({name: /mongo/});

//相当于%%

select * from userInfo where name like ‘%mongo%’;



10、查询name中以mongo开头的

db.userInfo.find({name: /^mongo/});

select * from userInfo where name like ‘mongo%’;



11、查询指定列name、age数据

db.userInfo.find({}, {name: 1, age: 1});

相当于:select name, age from userInfo;

当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。



12、查询指定列name、age数据, age > 25

db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});

相当于:select name, age from userInfo where age > 25;



13、按照年龄排序

升序:db.userInfo.find().sort({age: 1});

降序:db.userInfo.find().sort({age: -1});



14、查询name = zhangsan, age = 22的数据

db.userInfo.find({name: 'zhangsan', age: 22});

相当于:select * from userInfo where name = ‘zhangsan’ and age = ‘22’;



15、查询前5条数据

db.userInfo.find().limit(5);

相当于:select top 5 * from userInfo;



16、查询10条以后的数据

db.userInfo.find().skip(10);

相当于:select * from userInfo where id not in (

select top 10 * from userInfo

);



17、查询在5-10之间的数据

db.userInfo.find().limit(10).skip(5);

可用于分页,limit是pageSize,skip是第几页*pageSize



18、or与 查询

db.userInfo.find({$or: [{age: 22}, {age: 25}]});

相当于:select * from userInfo where age = 22 or age = 25;



19、查询第一条数据

db.userInfo.findOne();

相当于:select top 1 * from userInfo;

db.userInfo.find().limit(1);



20、查询某个结果集的记录条数

db.userInfo.find({age: {$gte: 25}}).count();

相当于:select count(*) from userInfo where age >= 20;



21、按照某列进行排序

db.userInfo.find({sex: {$exists: true}}).count();

相当于:select count(sex) from userInfo;

Ø 索引

1、创建索引

db.userInfo.ensureIndex({name: 1});

db.userInfo.ensureIndex({name: 1, ts: -1});



2、查询当前聚集集合所有索引

db.userInfo.getIndexes();



3、查看总索引记录大小

db.userInfo.totalIndexSize();



4、读取当前集合的所有index信息

db.users.reIndex();



5、删除指定索引

db.users.dropIndex("name_1");



6、删除所有索引索引

db.users.dropIndexes();

Ø 修改、添加、删除集合数据

1、添加

db.users.save({name: ‘zhangsan’, age: 25, sex: true});

添加的数据的数据列,没有固定,根据添加的数据为准



2、修改

db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);

相当于:update users set name = ‘changeName’ where age = 25;



db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);

相当于:update users set age = age + 50 where name = ‘Lisi’;



db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);

相当于:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;



3、删除

db.users.remove({age: 132});



4、查询修改删除

db.users.findAndModify({

    query: {age: {$gte: 25}},

    sort: {age: -1},

    update: {$set: {name: 'a2'}, $inc: {age: 2}},

    remove: true

});



db.runCommand({ findandmodify : "users",

    query: {age: {$gte: 25}},

    sort: {age: -1},

    update: {$set: {name: 'a2'}, $inc: {age: 2}},

    remove: true

});

update 或 remove 其中一个是必须的参数; 其他参数可选。

参数


详解


默认值

query


查询过滤条件


{}

sort


如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,该对象将被操作


{}

remove


若为true,被选中对象将在返回前被删除


N/A

update


一个 修改器对象


N/A

new


若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。


false

fields


参见Retrieving a Subset of Fields (1.5.0+)


All fields

upsert


创建新对象若查询结果为空。 示例 (1.5.4+)


false

Ø 语句块操作

1、简单Hello World

print("Hello World!");

这种写法调用了print函数,和直接写入"Hello World!"的效果是一样的;



2、将一个对象转换成json

tojson(new Object());

tojson(new Object('a'));



3、循环添加数据

> for (var i = 0; i < 30; i++) {

... db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2});

... };

这样就循环添加了30条数据,同样也可以省略括号的写法

> for (var i = 0; i < 30; i++) db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2});

也是可以的,当你用db.users.find()查询的时候,显示多条数据而无法一页显示的情况下,可以用it查看下一页的信息;



4、find 游标查询

>var cursor = db.users.find();

> while (cursor.hasNext()) {

    printjson(cursor.next());

}

这样就查询所有的users信息,同样可以这样写

var cursor = db.users.find();

while (cursor.hasNext()) { printjson(cursor.next); }

同样可以省略{}号



5、forEach迭代循环

db.users.find().forEach(printjson);

forEach中必须传递一个函数来处理每条迭代的数据信息



6、将find游标当数组处理

var cursor = db.users.find();

cursor[4];

取得下标索引为4的那条数据

既然可以当做数组处理,那么就可以获得它的长度:cursor.length();或者cursor.count();

那样我们也可以用循环显示数据

for (var i = 0, len = c.length(); i < len; i++) printjson(c[i]);



7、将find游标转换成数组

> var arr = db.users.find().toArray();

> printjson(arr[2]);

用toArray方法将其转换为数组



8、定制我们自己的查询结果

只显示age <= 28的并且只显示age这列数据

db.users.find({age: {$lte: 28}}, {age: 1}).forEach(printjson);

db.users.find({age: {$lte: 28}}, {age: true}).forEach(printjson);

排除age的列

db.users.find({age: {$lte: 28}}, {age: false}).forEach(printjson);



9、forEach传递函数显示信息

db.things.find({x:4}).forEach(function(x) {print(tojson(x));});

上面介绍过forEach需要传递一个函数,函数会接受一个参数,就是当前循环的对象,然后在函数体重处理传入的参数信息

相关推荐

    海图引擎开发指南

    关于海图引擎的开发指南,支持C++ \C#

    电子海图免费版

    电子海图,作为航海领域的重要工具,是现代船舶航行安全的重要保障。电子海图系统(Electronic Navigational Chart,简称ENC)是国际海事组织(IMO)推荐的标准海图形式,它结合了数字地图和GPS定位技术,为航海者...

    超图电子海图设计软件使用指南

    海图是航海中不可或缺的工具,它提供了关于海洋水域和沿岸地形的详细信息,以确保航行的安全性。海图一般分为普通海图和专用海图两大类。专用海图特指电子海图,即电子航海图(ENC),是一种专为电子海图显示与信息...

    电子海图浏览器 电子海图二次开发 电子海图引擎

    在本例中,所提及的电子海图浏览器是用Qt库开发的,Qt是一个流行的开源C++框架,它支持多平台开发,意味着该浏览器可以在Windows、Linux、macOS等多种操作系统上运行。 电子海图是航海领域的重要组成部分,它们以...

    电子海图 电子海图浏览器 电子海图二次开发

    电子海图技术是现代航海领域中的重要组成部分,它利用数字地图数据来呈现海洋地理信息,大大提升了航行的安全性和效率。本文将围绕“电子海图”、“电子海图浏览器”以及“电子海图二次开发”这三个核心概念进行深入...

    电子海图浏览器,电子海图二次开发,电子海图源码分享

    电子海图技术是现代航海领域中的重要组成部分,它利用数字化地图数据来呈现海洋地理信息,大大提升了航行的安全性和效率。本文将围绕“电子海图浏览器”、“电子海图二次开发”以及“电子海图源码分享”这三大主题...

    电子海图提取_电子海图_海图_提取水深_leafo8x_Electronicchart.

    在本资料中,我们将深入探讨电子海图的下载方法以及如何提取和处理水深数据。 首先,下载电子海图通常需要通过官方认可的海图更新服务提供商,如国际海道测量组织(IHO)认证的供应商。这些供应商会提供符合S-57...

    s57int1_xref.zip_Electronic Chart_s57_海图_电子海图

    在本压缩包"S57int1_xref.zip"中,包含了与S57标准相关的电子海图开发和使用的文档资料,这对于理解ECDIS系统及其数据交换格式至关重要。 S57是国际海事组织(IMO)制定的一种国际标准,全称为“International ...

    S57海图打包上传

    《S57海图打包上传:深度解析与应用》 S57海图,作为国际水道测量组织(International Hydrographic Organization, IHO)制定的一种标准格式,是电子海图数据(Electronic Navigational Chart, ENC)的核心组成部分...

    天津大学电子海图浏览器TjuES57MapViewer及其上层源码

    TjuES57MapViewer是将天津大学电子海图控件TjuES57Map作为电子海图引擎开发的电子海图显示系统。 天津大学电子海图控件TjuES57Map为AIMIP实验室独立自主开发,具有独立知识产权的S-57海图引擎,适用于Windows系列...

    s57标准电子海图.000文件

    《深入理解S57标准电子海图:.000文件解析与应用》 S57标准电子海图,作为国际水道测量组织(International Hydrographic Organization, IHO)制定的一种数据交换格式,是现代航海领域的重要工具。.000文件作为S57...

    电子海图浏览器与海图

    电子海图(Electronic Navigational Chart,ENC)是现代航海领域的重要工具,它结合了数字化、信息化技术,为船舶航行提供了精确、实时的海图信息。电子海图浏览器则是显示和操作这些电子海图的软件系统,使得船员...

    电子海图.rar

    本压缩包文件"电子海图.rar"包含四张以".000"格式存储的电子海图。这种格式通常是专门的海图软件或应用程序所使用的,例如在描述中提到的"YimaEncViewer",它是一个能够查看和处理此类海图的软件。 首先,我们需要...

    电子海图国家标准

    - **真运动显示 (True Motion Display)**:以海图为固定参照物,显示本船位置和其他活动目标在地球表面的实际运动情况。 - **相对运动显示 (Relative Motion Display)**:以本船位置为参照物,显示海图和其他活动...

    安卓版电子海图

    免费版的安卓电子海图,可以动态的显示船舶,非常棒的软件,另外如果电脑方便上网开一登陆www.marinetraffic.com网页版的电子海图,看着更爽……

    .000格式的海图

    .000格式的海图,可在电子海图查看或浏览器中导入。适用于电子海图开发。

    蚂蚁海图平台

    "蚂蚁海图平台"是蚂蚁技术团队开发的一款跨平台电子海图系统,旨在提供高效、准确的航海导航服务。该平台具有对国际标准S57和SHP格式海图数据的强大解析与显示功能,同时支持AIS(Automatic Identification System)...

    支持S57的电子海图软件

    《支持S57的电子海图软件:深入解析与应用》 在航海领域,电子海图(Electronic Navigational Chart,ENC)已经成为现代导航的重要工具,而S57标准则是国际上广泛采用的电子海图数据交换格式。本文将详细探讨一款...

    基于S57国际标准的电子海图显示与导航系统.zip_ENC s57_arpa_s57海图_s57海图的显示_电子展成

    电子海图显示与信息系统(ECDIS)是随当代电子计算机技术的飞速发展而发 展起来的,是继雷达/ARPA.?_后在船舶导航方面又一项伟大的技术革命,已发展成 为一种新型的船舶导航系统和辅助决策系统。它不仅能连续给出...

    S57标准的电子海图(120张图测试用),已经转换为.shp格式

    本资源包含120张基于S57标准的电子海图,但这些海图已经被转换为.shp(Shapefile)格式。Shapefile是一种常见的地理信息系统(GIS)数据格式,由Esri公司开发,广泛用于存储地理空间矢量数据,如点、线、多边形等...

Global site tag (gtag.js) - Google Analytics