Примечание. Хотя я ориентируюсь на Windows Phone 7, в нем нет ничего, кроме ограничений по размеру.
Пытаясь написать приложение GPS/маршрутизации/карты для Windows Phone 7, я пытаюсь использовать OpenStreetMap для этого, и я хочу, чтобы мои данные хранились в SQL Server База данных Compact Edition на моей Windows Phone 7. Это доставляет мне много неприятностей, поэтому я не знаю, как правильно...
Вот мой прогресс:
Я скачал
Belgium.osm.pbf
, который содержит все данные OSM Бельгии в формат PBF.Обратите внимание, что Бельгия не такая большая, это страна, в которой я живу, так что это хорошее начало.
Было бы неплохо, если бы моя база данных была размером с этот PBF-файл, потому что она всего 80 МБ...
Используя protobuf-net Марка Гравелла, я написал синтаксический анализатор, который дает мне все данные ОСМ.
При первой попытке я попытался просто загрузить все это в память, но это кажется слишком большим для моего Windows Phone 7, так как в результате получается размер> 512 МБ. Тогда идея заключалась в том, что мне нужна база данных для хранения этой информации, поэтому кажется логичным хранить ее в файле SQL Server Compact Edition
sdf
.Следовательно, я создал следующие DataContext и таблицы в LINQ to SQL:
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; } }
Сначала я использовал
InsertOnSubmitTour()
сSubmitChanges()
время от времени, но, по-видимому, это слишком медленно, так какSubmitChanges()
вставляет строку за строкой. Затем я попробовалSqlBulkCopy
, который, по-видимому, не работает для SQL Server Compact Edition, в результате чего я остановился на SqlCeBulkCopy который кажется быстрее, но все же медленный.
Есть две проблемы, которые я испытываю с этим решением:
Он по-прежнему довольно медленный.
Результирующий размер во много раз больше. Обратите внимание, что
Belgium.osm.pbf
составляет всего ~80 МБ. Однако.sdf
составляет ~ 592 МБ, могу ли я что-нибудь с этим поделать?
Итак, вот мои вопросы:
В чем я ошибся? Что мне делать вместо этого?
Я нахожу это действительно странным, что так сложно правильно обработать файл размером 80 МБ. Также обратите внимание, что в данный момент я выполняю все эти вычисления на своем компьютере, и как только он будет нормально работать на компьютере, я попробую его на Windows Phone 7.
Если действительно нет удобного решения LINQ, имеет ли смысл создавать индексированный PBF?
Это, однако, требует, чтобы я заново изобретал то, что база данных уже могла мне предоставить.
Есть ли смысл увеличить размер на моем компьютере, по сути, написав конвертер, а затем отправить файл базы данных размером ~592 МБ
.sdf
на мой телефон?Кажется, это последнее средство, промежуточное между вариантами 1 и 2, но это не делает приложение доступным для загрузки в MarketPlace, поскольку довольно неприятно предварительно конвертировать на компьютере, а затем каким-то образом получить его на телефон.
Обратите внимание, что я фокусируюсь на вопросе 1, а остальные вопросы являются просто решениями, если окажется, что это невозможно, я просто упустил что-то, что сделало бы это беглым, но я понятия не имею.. .