【发布时间】:2012-02-05 20:58:12
【问题描述】:
注意:虽然我的目标是 Windows Phone 7,但它除了大小限制之外没有引入任何东西。
在尝试为 Windows Phone 7 编写 GPS / 路由 / 地图应用程序时,我试图为此使用 OpenStreetMap,并且我想将我的数据存储在我的 SQL Server Compact Edition 数据库中Windows Phone 7。这给我带来了很多麻烦,所以我不知道正确的方法是什么......
这是我的进步:
-
我已下载
Belgium.osm.pbf,其中包含PBF format 中的所有比利时OSM 数据。请注意,比利时并没有那么大,这是我居住的国家,所以这似乎是一个好的开始。
如果我的数据库接近那个 PBF 文件的大小就好了,因为它只有 80 MB...
使用 Marc Gravell 的 protobuf-net,我现在编写了一个解析器,它可以为我提供所有 OSM 数据。
在第一次尝试时,我尝试将其全部加载到内存中,但这对于我的 Windows Phone 7 来说似乎太大了,因为它导致大小 > 512 MB。然后我的想法是我需要一个数据库来存储这些信息,因此将其存储在 SQL Server Compact Edition
sdf文件中似乎是合乎逻辑的。-
因此,我在 LINQ to SQL 中创建了以下 DataContext 和表:
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; } } 首先,我不时地使用
SubmitChanges()继续InsertOnSubmitTour(),但这显然会因为SubmitChanges()逐行插入而变慢。所以然后我去尝试SqlBulkCopy,这显然不适用于 SQL Server Compact Edition,这让我最终选择了SqlCeBulkCopy,它似乎更快但仍然很慢。
我在使用此解决方案时遇到了两个问题:
还是很慢。
生成的大小要大很多倍。请注意,
Belgium.osm.pbf仅约为 80 MB。.sdf不过似乎是 ~592 MB,对此我有什么办法吗?
所以,这是我的问题:
-
我哪里完全出错了?我应该怎么做?
我觉得很难正确处理一个 80 MB 的文件真的很奇怪。另请注意,我目前正在我的计算机上进行所有这些计算,一旦它在计算机上正常运行,我将在 Windows Phone 7 上进行尝试。
-
如果真的没有方便的 LINQ 解决方案,那么生成索引 PBF 是否有意义?
然而,这需要我重新发明数据库已经可以提供给我的东西。
-
在我的计算机上增加大小是否有意义,本质上是编写一个转换器,然后将 ~592 MB
.sdf数据库文件发送到我的手机?这似乎是介于选项 1 和 2 之间的最后手段,但这并不能使应用程序能够上传到 MarketPlace,因为必须提前在计算机上转换然后以某种方式将其加载到该应用程序上是非常令人讨厌的电话。
请注意,我专注于问题 1,如果证明不可能,其他问题只是解决方案,我只是遗漏了一些可以使问题变得流畅的东西,但我没有想法...
【问题讨论】:
-
部分我认为您应该在加载应用程序之前将所有数据放入数据库。
-
@surfasb:我知道,这就是我的计划。但是我的数据库目前效率很低,see an example here,我知道导入了很多无用的数据,但是很难将这些数据从数据库中取出。导入后,我必须保留一个单独的内存节点 ID 列表,以过滤掉我不需要的道路节点(因为它们是单独加载的),或者我需要在之后删除它们,但这也很慢。换句话说,我还没有找到正确的存储方式。
标签: linq-to-sql sql-server-ce openstreetmap sqlbulkcopy