은 첫째로 당신이 아마하고 싶은 사용하는 자산과 파일 시스템에 직접 액세스하는 것처럼 응용 프로그램 나던 동일하게 작동으로이 Tutorial
포함 파일을 따르십시오. 지금 당신은 자산에서 FileInfo
을 얻을 수 없을 것이나 당신은 그 (것)들을 읽을 수있을 것이다.
먼저 ireland.osm.pbf
파일을 Assets
디렉토리에 놓습니다. 다음으로해야합니다. (보통 기존 항목 추가을 선택하면 빌드 작업을 AndroidAsset
으로 설정해야합니다. 이것은 Android 패키지의 일부로 파일을 빌드 (패키지)합니다.
다음 자산은 AssetManager
을 통해로드 (액세스)됩니다. 다행히도 이것은 Activity Context에서 this.Assets
을 통해 사용할 수 있습니다.
자산을 읽는 것은 아주 간단합니다.
using (StreamReader sr = new StreamReader (Assets.Open ("ireland.osm.pbf")))
{
//do as you wish with the stream reader.
}
편집 : 주석에서
. 링크를 다음과 같이
는하지만 난 PBFOsmStreamSource()를 구현하기 위해에서는 FileInfo가 필요
나는
PBFOsmStreamSource()
에 대한 소스 코드를 간단히 살펴했다 생성자가
:
/// <summary>
/// Creates a new source of PBF formated OSM data.
/// </summary>
/// <param name="stream"></param>
public PBFOsmStreamSource(Stream stream)
{
_stream = stream;
}
을 이제 스트림 리더가 이 아닌Stream
으로 변환해야합니다. Stream
으로 변환해야하지만, 속성은 BaseStream
입니다. 이제는 전화 할 수있는 테스트 환경이 없습니다.
using (StreamReader sr = new StreamReader(Assets.Open("ireland.osm.pbf")))
{
//do as you wish with the stream reader.
var pbfStreamSource = new PBFOsmStreamSource(sr.BaseStream);
}
EDIT
방법을 지원하지 않는다. PBFOsmStreamSource
의 출처를 자세히 읽으십시오.
private void Initialize()
{
_stream.Seek(0, SeekOrigin.Begin);
this.InitializePBFReader();
}
따라서 귀하는 System.NotSupportedException
예외가 발생합니다. 따라서 Seek()
메서드를 지원하는 스트림을 만들어야합니다. Fortunatly MemoryStream
은 위치를 변경할 수 있으며 Seek()
방법을 지원합니다.
다시 테스트 환경이 없습니다.
using (StreamReader sr = new StreamReader(Assets.Open("ireland.osm.pbf")))
{
using (var ms = new MemoryStream())
{
sr.BaseStream.CopyTo(ms);
var pbfStreamSource = new PBFOsmStreamSource(ms);
}
}
최종 편집
더 검토 한 결과, 자신의 샘플을보고 난 당신이 모바일에서와 같은 FASION에 StreamReader
를 사용하는 예 콘솔 응용 프로그램을 작성했습니다. 이제는 약간 수정하여 StreamReader
을 처분 할 수 있습니다.이 파일은 많은 양의 메모리를 소비하므로 한 번에 두 스트림을 모두 열 필요가 없습니다. 다음과 같이
using OsmSharp.Geo;
using OsmSharp.Osm.PBF.Streams;
using System;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
namespace Sample.GeometryStream
{
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
static async Task Test()
{
await ToFile("http://files.itinero.tech/data/OSM/planet/europe/luxembourg-latest.osm.pbf", "test.pbf");
var sr = new StreamReader("test.pbf");
using (var ms = new MemoryStream())
{
try
{
sr.BaseStream.CopyTo(ms);
}
catch
{
//TODO: Handle exceptions
}
finally
{
sr.Close();
sr.Dispose();
}
var pbfStreamSource = new PBFOsmStreamSource(ms);
}
}
public static async Task ToFile(string url, string filename)
{
if (!File.Exists(filename))
{
var client = new HttpClient();
using (var stream = await client.GetStreamAsync(url))
using (var outputStream = File.OpenWrite(filename))
{
stream.CopyTo(outputStream);
}
}
}
}
}
)이 나 파일에 액세스 할 수 있습니다하지만 난이 PBFOsmStreamSource을 (구현할에서는 FileInfo가 필요합니다 [링크] (https://github.com/OsmSharp/ui/wiki/A-getting-started -example) – Ruairi
@Rani 응답을 업데이트했습니다. 'StreamReader'의'BaseStream' 속성을보세요 – Nico
당신의 제안을 시도해보십시오. 이 오류가 발생했으나 관련이 없습니다 ... _ {System.NotSupportedException : 지정된 메소드가 지원되지 않습니다. Android.Runtime.InputStreamInvoker.Seek (Int64 오프셋, SeekOrigin 원점) /Users/builder/data/lanes/3415/7db2aac3/source/monodroid/src/Mono.Android/src/Runtime/InputStreamInvoker.cs의 [0x00000] : 0xOsmSharp.Osm.Streams.PBFOsmStreamSource에서 38 Instialize() [파일 이름 알 수 없음] :OsmSharp.Osm.Streams.Filters.OsmStreamFilterTagsFilter.Initialize() [0x00007] in : 0 at OsmSharp.Osm.Streams.OsmStreamTarget.Pull() _ –
Ruairi