Linq to sql 如何以索引方式高效地存储所有OpenStreetMap数据?
注意:虽然我的目标是Windows Phone 7,但除了尺寸限制之外,它没有引入任何内容 在尝试为WindowsPhone7编写GPS/路由/地图应用程序时,我尝试使用它,并希望将数据存储在我手机上的数据库中。这给了我很多麻烦,所以我不知道什么是正确的方法 以下是我的进展:Linq to sql 如何以索引方式高效地存储所有OpenStreetMap数据?,linq-to-sql,sql-server-ce,openstreetmap,sqlbulkcopy,Linq To Sql,Sql Server Ce,Openstreetmap,Sqlbulkcopy,注意:虽然我的目标是Windows Phone 7,但除了尺寸限制之外,它没有引入任何内容 在尝试为WindowsPhone7编写GPS/路由/地图应用程序时,我尝试使用它,并希望将数据存储在我手机上的数据库中。这给了我很多麻烦,所以我不知道什么是正确的方法 以下是我的进展: 我已经下载了,其中包含所有比利时OSM数据 请注意,比利时并没有那么大,它是我居住的国家,所以这似乎是一个好的开始 如果我的数据库接近那个PBF文件的大小就好了,因为它只有80MB 使用Marc Gravell,我现在已经
sdf
文件中似乎是合乎逻辑的public class RoutingContext : DataContext
{
public RoutingContext()
#if WINDOWS_PHONE
: base("Data Source = 'isostore:/RoutingDB.sdf'; Max Database Size = 1024; Max Buffer Size = 65536")
#else
: base("Data Source = './RoutingDB.sdf'; Max Database Size = 1024; Max Buffer Size = 65536")
#endif
{
}
public Table<Node> Nodes;
public Table<Road> Roads;
public Table<RoadNode> RoadNodes;
public Table<NodeProperty> NodeProperties;
public Table<RoadProperty> RoadProperties;
public Table<StringData> Strings;
}
[Table]
public class Node
{
[Column(IsPrimaryKey = true)]
public int Id { get; set; }
[Column()]
public int Lon { get; set; }
[Column()]
public int Lat { get; set; }
}
[Table]
public class NodeProperty
{
[Column()]
public int NodeId { get; set; }
[Column(DbType = "NVarChar(255) NOT NULL")]
public int Key { get; set; }
[Column(DbType = "NVarChar(255) NOT NULL")]
public int Value { get; set; }
}
[Table]
public class RoadProperty
{
[Column()]
public int RoadId { get; set; }
[Column(DbType = "NVarChar(255) NOT NULL")]
public int Key { get; set; }
[Column(DbType = "NVarChar(255) NOT NULL")]
public int Value { get; set; }
}
[Table]
public class Road
{
[Column(IsPrimaryKey = true)]
public int Id { get; set; }
}
[Table]
public class RoadNode
{
[Column()]
public int RoadId { get; set; }
[Column()]
public int NodeId { get; set; }
}
[Table]
public class StringData
{
[Column(IsPrimaryKey = true)]
public int Id { get; set; }
[Column(DbType = "NVarChar(255) NOT NULL")]
public String String { get; set; }
}
公共类路由上下文:DataContext
{
公共路由上下文()
#如果WINDOWS\u手机
:base(“数据源='isostore:/RoutingDB.sdf';最大数据库大小=1024;最大缓冲区大小=65536”)
#否则
:base(“数据源=”./RoutingDB.sdf';最大数据库大小=1024;最大缓冲区大小=65536”)
#恩迪夫
{
}
公共表节点;
公用道路;
公共表节点;
公共表节点属性;
公众餐桌酒店;
公共表字符串;
}
[附表]
公共类节点
{
[列(IsPrimaryKey=true)]
公共int Id{get;set;}
[列()]
公共int Lon{get;set;}
[列()]
公共int Lat{get;set;}
}
[附表]
公共类节点属性
{
[列()]
公共int节点ID{get;set;}
[列(DbType=“NVarChar(255)非空”)]
公共int密钥{get;set;}
[列(DbType=“NVarChar(255)非空”)]
公共int值{get;set;}
}
[附表]
公共级道路财产
{
[列()]
public int RoadId{get;set;}
[列(DbType=“NVarChar(255)非空”)]
公共int密钥{get;set;}
[列(DbType=“NVarChar(255)非空”)]
公共int值{get;set;}
}
[附表]
公共道路
{
[列(IsPrimaryKey=true)]
公共int Id{get;set;}
}
[附表]
公共类道路节点
{
[列()]
public int RoadId{get;set;}
[列()]
公共int节点ID{get;set;}
}
[附表]
公共类字符串数据
{
[列(IsPrimaryKey=true)]
公共int Id{get;set;}
[列(DbType=“NVarChar(255)非空”)]
公共字符串{get;set;}
}
SubmitChanges()
进行insertonsumbmitour()
插入,但这显然是一种放慢速度的方法,因为SubmitChanges()
每行插入一行。然后我尝试了SqlBulkCopy
,它显然不适用于SQLServer Compact Edition,这让我最终发现它似乎更快,但仍然很慢比利时.osm.pbf
只有~80MB。然而,.sdf
似乎约为592MB,对此我能做些什么吗.sdf
数据库文件发送到我的手机,这样做有意义吗?
这似乎是介于选项1和选项2之间的最后一种选择,但这并不能使应用程序能够上传到市场,因为必须事先在计算机上转换,然后以某种方式将其上传到手机上,这是非常令人讨厌的请注意,我关注的是问题1,其他问题仅仅是解决方案,如果这被证明是不可能的,我只是错过了一些可以让这变得流畅的东西,但我不知道…使用数据库来解决这一问题是有意义的。这个大小可能是由于pbf文件的紧凑性造成的,还请记住SQL CE中的所有数据都是unicode。你的问题不清楚-什么是慢?此外,您可以尝试在导入后压缩数据库文件,这可能会使文件缩小一点。根据生成的大小,您的.xap对于市场来说可能仍然足够小。(由于.xap也压缩了sdf文件)WriteToServer速度很慢,但我想我只能尝试剥离数据,只在数据库中存储我真正需要的数据,这将进一步优化磁盘占用空间。关于这个答案,我的问题是:我可以将其更改为非unicode吗?紧凑不是只对插入有零影响吗?我认为市场不接受这么大的文件…我写了SqlCeBulkCopy,它让我担心WriteToServer太慢,你能分享一些代码吗?最大XAP大小为225 MB!你在说什么契约?是SqlCeEngine的还是你自己写的?因为SqlCeEngine在运行其他t时似乎什么也没做