Update boundary for poi data
This commit is contained in:
parent
3b4f0ec85f
commit
e47d9efe5f
8 changed files with 718 additions and 172 deletions
|
@ -20,6 +20,7 @@ import net.osmand.StringMatcher;
|
|||
import net.osmand.binary.BinaryMapAddressReaderAdapter.AddressRegion;
|
||||
import net.osmand.binary.BinaryMapPoiReaderAdapter.PoiRegion;
|
||||
import net.osmand.binary.BinaryMapTransportReaderAdapter.TransportIndex;
|
||||
import net.osmand.data.Amenity;
|
||||
import net.osmand.data.Building;
|
||||
import net.osmand.data.City;
|
||||
import net.osmand.data.MapObject;
|
||||
|
@ -179,6 +180,34 @@ public class BinaryMapIndexReader {
|
|||
return mapIndexes.size() > 0;
|
||||
}
|
||||
|
||||
public boolean containsPoiData(){
|
||||
return poiIndexes.size() > 0;
|
||||
}
|
||||
|
||||
public boolean containsPoiData(double latitude, double longitude) {
|
||||
int x = MapUtils.get31TileNumberX(longitude);
|
||||
int y = MapUtils.get31TileNumberY(latitude);
|
||||
for (PoiRegion index : poiIndexes) {
|
||||
if (index.right31X >= x && index.left31X <= x && index.top31Y <= y && index.bottom31Y >= y) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean containsPoiData(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude) {
|
||||
int leftX = MapUtils.get31TileNumberX(leftLongitude);
|
||||
int rightX = MapUtils.get31TileNumberX(rightLongitude);
|
||||
int bottomY = MapUtils.get31TileNumberY(bottomLatitude);
|
||||
int topY = MapUtils.get31TileNumberY(topLatitude);
|
||||
for (PoiRegion index : poiIndexes) {
|
||||
if (index.right31X >= leftX && index.left31X <= rightX && index.top31Y <= bottomY && index.bottom31Y >= topY) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean containsMapData(int tile31x, int tile31y, int zoom){
|
||||
for(MapIndex mapIndex : mapIndexes){
|
||||
for(MapRoot root : mapIndex.getRoots()){
|
||||
|
@ -891,6 +920,22 @@ public class BinaryMapIndexReader {
|
|||
|
||||
}
|
||||
|
||||
public List<Amenity> searchPoi(SearchRequest<Amenity> req) throws IOException {
|
||||
req.numberOfVisitedObjects = 0;
|
||||
req.numberOfAcceptedObjects = 0;
|
||||
req.numberOfAcceptedSubtrees = 0;
|
||||
req.numberOfReadSubtrees = 0;
|
||||
for (PoiRegion poiIndex : poiIndexes) {
|
||||
codedIS.seek(poiIndex.filePointer);
|
||||
int old = codedIS.pushLimit(poiIndex.length);
|
||||
poiAdapter.searchPoiIndex(req.left, req.right, req.top, req.bottom, req, poiIndex);
|
||||
codedIS.popLimit(old);
|
||||
}
|
||||
log.info("Search poi is done. Visit " + req.numberOfVisitedObjects + " objects. Read " + req.numberOfAcceptedObjects + " objects."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
log.info("Read " + req.numberOfReadSubtrees + " subtrees. Go through " + req.numberOfAcceptedSubtrees + " subtrees."); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
||||
return req.getSearchResults();
|
||||
}
|
||||
|
||||
private List<String> readStringTable() throws IOException{
|
||||
List<String> list = new ArrayList<String>();
|
||||
while(true){
|
||||
|
@ -930,6 +975,17 @@ public class BinaryMapIndexReader {
|
|||
}
|
||||
|
||||
|
||||
public static SearchRequest<Amenity> buildSearchPoiRequest(int sleft, int sright, int stop, int sbottom, int zoom){
|
||||
SearchRequest<Amenity> request = new SearchRequest<Amenity>();
|
||||
request.left = sleft;
|
||||
request.right = sright;
|
||||
request.top = stop;
|
||||
request.bottom = sbottom;
|
||||
request.zoom = zoom;
|
||||
return request;
|
||||
}
|
||||
|
||||
|
||||
public static SearchRequest<TransportStop> buildSearchTransportRequest(int sleft, int sright, int stop, int sbottom, int limit, List<TransportStop> stops){
|
||||
SearchRequest<TransportStop> request = new SearchRequest<TransportStop>();
|
||||
if (stops != null) {
|
||||
|
@ -1146,11 +1202,19 @@ public class BinaryMapIndexReader {
|
|||
testTransportSearch(reader);
|
||||
|
||||
PoiRegion poiRegion = reader.getPoiIndexes().get(0);
|
||||
for (int i = 0; i < poiRegion.categories.size(); i++) {
|
||||
System.out.println(poiRegion.categories.get(i));
|
||||
System.out.println(" " + poiRegion.subcategories.get(i));
|
||||
System.out.println(poiRegion.left31X + " " + poiRegion.right31X + " " + poiRegion.bottom31Y + " " + poiRegion.top31Y);
|
||||
// for (int i = 0; i < poiRegion.categories.size(); i++) {
|
||||
// System.out.println(poiRegion.categories.get(i));
|
||||
// System.out.println(" " + poiRegion.subcategories.get(i));
|
||||
// }
|
||||
int sleft = MapUtils.get31TileNumberX(37.72);
|
||||
int sright = MapUtils.get31TileNumberX(37.727);
|
||||
int stop = MapUtils.get31TileNumberY(55.814);
|
||||
int sbottom = MapUtils.get31TileNumberY(55.81);
|
||||
List<Amenity> results = reader.searchPoi(buildSearchPoiRequest(sleft, sright, stop, sbottom, 15));
|
||||
for(Amenity a : results){
|
||||
System.out.println(a.getType() + " " + a.getSubType() + " " + a.getName() + " " + a.getLocation());
|
||||
}
|
||||
http://www.openstreetmap.org/?lat=55.81111&lon=37.72368&zoom=16&layers=M
|
||||
|
||||
System.out.println("MEMORY " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())); //$NON-NLS-1$
|
||||
System.out.println("Time " + (System.currentTimeMillis() - time)); //$NON-NLS-1$
|
||||
|
|
|
@ -743,7 +743,7 @@ public class BinaryMapIndexWriter {
|
|||
codedOutStream.writeMessage(OsmAndTransportIndex.STRINGTABLE_FIELD_NUMBER, st.build());
|
||||
}
|
||||
|
||||
public long startWritePOIIndex(String name) throws IOException {
|
||||
public long startWritePOIIndex(String name, int left31, int right31, int bottom31, int top31) throws IOException {
|
||||
pushState(POI_INDEX_INIT, OSMAND_STRUCTURE_INIT);
|
||||
codedOutStream.writeTag(OsmandOdb.OsmAndStructure.POIINDEX_FIELD_NUMBER, WireFormat.WIRETYPE_FIXED32_LENGTH_DELIMITED);
|
||||
stackBounds.push(new Bounds(0, 0, 0, 0)); // for poi index tree
|
||||
|
@ -751,6 +751,12 @@ public class BinaryMapIndexWriter {
|
|||
if(name != null){
|
||||
codedOutStream.writeString(OsmandOdb.OsmAndPoiIndex.NAME_FIELD_NUMBER, name);
|
||||
}
|
||||
OsmandOdb.OsmAndTileBox.Builder builder = OsmandOdb.OsmAndTileBox.newBuilder();
|
||||
builder.setLeft(left31);
|
||||
builder.setRight(right31);
|
||||
builder.setTop(top31);
|
||||
builder.setBottom(bottom31);
|
||||
codedOutStream.writeMessage(OsmandOdb.OsmAndPoiIndex.BOUNDARIES_FIELD_NUMBER, builder.build());
|
||||
return startPoiIndex;
|
||||
}
|
||||
|
||||
|
@ -839,7 +845,7 @@ public class BinaryMapIndexWriter {
|
|||
writeInt32Size();
|
||||
}
|
||||
|
||||
public long startWritePoiBox(int zoom, int tileX, int tileY) throws IOException {
|
||||
public long startWritePoiBox(int zoom, int tileX, int tileY, boolean end) throws IOException {
|
||||
checkPeekState(POI_INDEX_INIT, POI_BOX);
|
||||
if(state.peek() == POI_INDEX_INIT){
|
||||
codedOutStream.writeTag(OsmandOdb.OsmAndPoiIndex.BOXES_FIELD_NUMBER, WireFormat.WIRETYPE_FIXED32_LENGTH_DELIMITED);
|
||||
|
@ -856,18 +862,18 @@ public class BinaryMapIndexWriter {
|
|||
|
||||
int pTileX = parentTileX << (zoom - parentZoom);
|
||||
int pTileY = parentTileY << (zoom - parentZoom);
|
||||
|
||||
codedOutStream.writeUInt32(OsmandOdb.OsmAndPoiBox.ZOOM_FIELD_NUMBER, (zoom - parentZoom));
|
||||
codedOutStream.writeSInt32(OsmandOdb.OsmAndPoiBox.LEFT_FIELD_NUMBER, tileX - pTileX);
|
||||
codedOutStream.writeSInt32(OsmandOdb.OsmAndPoiBox.TOP_FIELD_NUMBER, tileY - pTileY);
|
||||
codedOutStream.writeUInt32(OsmandOdb.OsmAndPoiBox.ZOOM_FIELD_NUMBER, (zoom - parentZoom));
|
||||
stackBounds.push(new Bounds(tileX, zoom, tileY, 0 ));
|
||||
|
||||
|
||||
codedOutStream.writeFixed32(OsmandOdb.OsmAndPoiBox.SHIFTTODATA_FIELD_NUMBER, 0);
|
||||
codedOutStream.flush();
|
||||
long filePointer = raf.getFilePointer() - 4;
|
||||
|
||||
return filePointer;
|
||||
if (end) {
|
||||
codedOutStream.writeFixed32(OsmandOdb.OsmAndPoiBox.SHIFTTODATA_FIELD_NUMBER, 0);
|
||||
codedOutStream.flush();
|
||||
long filePointer = raf.getFilePointer() - 4;
|
||||
return filePointer;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void endWritePoiBox() throws IOException {
|
||||
|
@ -911,7 +917,4 @@ public class BinaryMapIndexWriter {
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
package net.osmand.binary;
|
||||
|
||||
import gnu.trove.list.array.TIntArrayList;
|
||||
import gnu.trove.map.hash.TLongObjectHashMap;
|
||||
import gnu.trove.set.hash.TIntHashSet;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
@ -29,6 +27,11 @@ public class BinaryMapPoiReaderAdapter {
|
|||
List<String> categories = new ArrayList<String>();
|
||||
List<AmenityType> categoriesType = new ArrayList<AmenityType>();
|
||||
List<List<String>> subcategories = new ArrayList<List<String>>();
|
||||
|
||||
int left31X;
|
||||
int right31X;
|
||||
int top31Y;
|
||||
int bottom31Y;
|
||||
}
|
||||
|
||||
private CodedInputStreamRAF codedIS;
|
||||
|
@ -47,6 +50,32 @@ public class BinaryMapPoiReaderAdapter {
|
|||
return map.readInt();
|
||||
}
|
||||
|
||||
protected void readPoiBoundariesIndex(PoiRegion region) throws IOException {
|
||||
while(true){
|
||||
int t = codedIS.readTag();
|
||||
int tag = WireFormat.getTagFieldNumber(t);
|
||||
switch (tag) {
|
||||
case 0:
|
||||
return;
|
||||
case OsmandOdb.OsmAndTileBox.LEFT_FIELD_NUMBER:
|
||||
region.left31X = codedIS.readUInt32();
|
||||
break;
|
||||
case OsmandOdb.OsmAndTileBox.RIGHT_FIELD_NUMBER:
|
||||
region.right31X = codedIS.readUInt32();
|
||||
break;
|
||||
case OsmandOdb.OsmAndTileBox.TOP_FIELD_NUMBER:
|
||||
region.top31Y = codedIS.readUInt32();
|
||||
break;
|
||||
case OsmandOdb.OsmAndTileBox.BOTTOM_FIELD_NUMBER:
|
||||
region.bottom31Y = codedIS.readUInt32();
|
||||
break;
|
||||
default:
|
||||
skipUnknownField(t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void readPoiIndex(PoiRegion region) throws IOException {
|
||||
while(true){
|
||||
|
@ -58,13 +87,19 @@ public class BinaryMapPoiReaderAdapter {
|
|||
case OsmandOdb.OsmAndPoiIndex.NAME_FIELD_NUMBER :
|
||||
region.name = codedIS.readString();
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiIndex.CATEGORIESTABLE_FIELD_NUMBER :
|
||||
case OsmandOdb.OsmAndPoiIndex.BOUNDARIES_FIELD_NUMBER: {
|
||||
int length = codedIS.readRawVarint32();
|
||||
int oldLimit = codedIS.pushLimit(length);
|
||||
readPoiBoundariesIndex(region);
|
||||
codedIS.popLimit(oldLimit);
|
||||
}
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiIndex.CATEGORIESTABLE_FIELD_NUMBER : {
|
||||
int length = codedIS.readRawVarint32();
|
||||
|
||||
int oldLimit = codedIS.pushLimit(length);
|
||||
readCategory(region);
|
||||
codedIS.popLimit(oldLimit);
|
||||
break;
|
||||
} break;
|
||||
case OsmandOdb.OsmAndPoiIndex.BOXES_FIELD_NUMBER :
|
||||
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
|
||||
return;
|
||||
|
@ -112,7 +147,7 @@ public class BinaryMapPoiReaderAdapter {
|
|||
case 0:
|
||||
return;
|
||||
case OsmandOdb.OsmAndPoiIndex.BOXES_FIELD_NUMBER :
|
||||
int length = codedIS.readFixed32();
|
||||
int length = readInt();
|
||||
int oldLimit = codedIS.pushLimit(length);
|
||||
readBoxField(left31, right31, top31, bottom31, 0, 0, 0, offsets, req);
|
||||
codedIS.popLimit(oldLimit);
|
||||
|
@ -121,7 +156,7 @@ public class BinaryMapPoiReaderAdapter {
|
|||
offsets.sort();
|
||||
for (int j = 0; j < offsets.size(); j++) {
|
||||
codedIS.seek(offsets.get(j) + indexOffset);
|
||||
int len = codedIS.readFixed32();
|
||||
int len = readInt();
|
||||
int oldLim = codedIS.pushLimit(len);
|
||||
readPoiData(left31, right31, top31, bottom31, req, region);
|
||||
codedIS.popLimit(oldLim);
|
||||
|
@ -159,14 +194,14 @@ public class BinaryMapPoiReaderAdapter {
|
|||
zoom = codedIS.readUInt32();
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiBoxData.Y_FIELD_NUMBER :
|
||||
y= codedIS.readUInt32();
|
||||
y = codedIS.readUInt32();
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiBoxData.POIDATA_FIELD_NUMBER:
|
||||
int len = codedIS.readRawVarint32();
|
||||
int oldLim = codedIS.pushLimit(len);
|
||||
readPoiPoint(left31, right31, top31, bottom31, x, y, zoom, req, region);
|
||||
codedIS.popLimit(oldLim);
|
||||
return;
|
||||
break;
|
||||
default:
|
||||
skipUnknownField(t);
|
||||
break;
|
||||
|
@ -188,13 +223,15 @@ public class BinaryMapPoiReaderAdapter {
|
|||
am.setEnName(Junidecode.unidecode(am.getName()));
|
||||
}
|
||||
req.getSearchResults().add(am);
|
||||
req.numberOfAcceptedObjects++;
|
||||
return;
|
||||
case OsmandOdb.OsmAndPoiBoxDataAtom.DX_FIELD_NUMBER :
|
||||
x = (codedIS.readSInt32() + (px << (24 - zoom))) << 7;
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiBoxDataAtom.DY_FIELD_NUMBER :
|
||||
y = (codedIS.readSInt32() + (py << (24 - zoom))) << 7;
|
||||
if(left31 > x || right31 < x || top31 < y || bottom31 > y){
|
||||
req.numberOfVisitedObjects++;
|
||||
if(left31 > x || right31 < x || top31 > y || bottom31 < y){
|
||||
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
|
||||
return;
|
||||
}
|
||||
|
@ -202,7 +239,7 @@ public class BinaryMapPoiReaderAdapter {
|
|||
am.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x));
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiBoxDataAtom.CATEGORIES_FIELD_NUMBER :
|
||||
// TODO add many amenities
|
||||
// TODO support many amenities type
|
||||
int cat = codedIS.readUInt32();
|
||||
int subcatId = cat >> SHIFT_BITS_CATEGORY;
|
||||
int catId = cat & CATEGORY_MASK;
|
||||
|
@ -210,7 +247,7 @@ public class BinaryMapPoiReaderAdapter {
|
|||
am.setType(region.categoriesType.get(catId));
|
||||
List<String> subcats = region.subcategories.get(catId);
|
||||
if(subcatId < subcats.size()){
|
||||
am.setSubType(subcats.get(catId));
|
||||
am.setSubType(subcats.get(subcatId));
|
||||
}
|
||||
} else {
|
||||
am.setType(AmenityType.OTHER);
|
||||
|
@ -243,20 +280,11 @@ public class BinaryMapPoiReaderAdapter {
|
|||
|
||||
private void readBoxField(int left31, int right31, int top31, int bottom31,
|
||||
int px, int py, int pzoom, TIntArrayList offsets, SearchRequest<Amenity> req) throws IOException {
|
||||
if(pzoom > 0){
|
||||
int x1 = px << (31 - pzoom);
|
||||
int x2 = (px + 1) << (31 - pzoom);
|
||||
int y1 = py << (31 - pzoom);
|
||||
int y2 = (py + 1) << (31 - pzoom);
|
||||
// check intersection
|
||||
if(!(left31 <= x2 && x1 <= right31 && bottom31 <= y2 && y1 <= top31)){
|
||||
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
|
||||
}
|
||||
|
||||
}
|
||||
req.numberOfReadSubtrees++;
|
||||
boolean checkBox = true;
|
||||
int zoom = pzoom;
|
||||
int y = py;
|
||||
int x = px;
|
||||
int dy = py;
|
||||
int dx = px;
|
||||
while(true){
|
||||
if(req.isInterrupted()){
|
||||
return;
|
||||
|
@ -270,21 +298,36 @@ public class BinaryMapPoiReaderAdapter {
|
|||
zoom = codedIS.readUInt32() + pzoom;
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiBox.LEFT_FIELD_NUMBER :
|
||||
x = codedIS.readSInt32() + px;
|
||||
dx = codedIS.readSInt32();
|
||||
break;
|
||||
case OsmandOdb.OsmAndPoiBox.TOP_FIELD_NUMBER:
|
||||
y = codedIS.readSInt32() + py;
|
||||
dy = codedIS.readSInt32();
|
||||
break;
|
||||
|
||||
case OsmandOdb.OsmAndPoiBox.SUBBOXES_FIELD_NUMBER:
|
||||
int length = codedIS.readFixed32();
|
||||
int x = dx + (px << (zoom - pzoom));
|
||||
int y = dy + (py << (zoom - pzoom));
|
||||
if(checkBox){
|
||||
int xL = x << (31 - zoom);
|
||||
int xR = (x + 1) << (31 - zoom);
|
||||
int yT = y << (31 - zoom);
|
||||
int yB = (y + 1) << (31 - zoom);
|
||||
// check intersection
|
||||
if(left31 > xR || xL > right31 || bottom31 < yT || yB < top31){
|
||||
codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
|
||||
return;
|
||||
}
|
||||
req.numberOfAcceptedSubtrees++;
|
||||
checkBox = false;
|
||||
}
|
||||
int length = readInt();
|
||||
int oldLimit = codedIS.pushLimit(length);
|
||||
readBoxField(left31, right31, top31, bottom31, x, y, zoom, offsets, req);
|
||||
codedIS.popLimit(oldLimit);
|
||||
break;
|
||||
|
||||
case OsmandOdb.OsmAndPoiBox.SHIFTTODATA_FIELD_NUMBER:
|
||||
offsets.add(codedIS.readFixed32());
|
||||
offsets.add(readInt());
|
||||
break;
|
||||
default:
|
||||
skipUnknownField(t);
|
||||
|
|
|
@ -10960,6 +10960,411 @@ public final class OsmandOdb {
|
|||
// @@protoc_insertion_point(class_scope:OsmAndTransportIndex)
|
||||
}
|
||||
|
||||
public static final class OsmAndTileBox extends
|
||||
com.google.protobuf.GeneratedMessage {
|
||||
// Use OsmAndTileBox.newBuilder() to construct.
|
||||
private OsmAndTileBox() {
|
||||
initFields();
|
||||
}
|
||||
private OsmAndTileBox(boolean noInit) {}
|
||||
|
||||
private static final OsmAndTileBox defaultInstance;
|
||||
public static OsmAndTileBox getDefaultInstance() {
|
||||
return defaultInstance;
|
||||
}
|
||||
|
||||
public OsmAndTileBox getDefaultInstanceForType() {
|
||||
return defaultInstance;
|
||||
}
|
||||
|
||||
public static final com.google.protobuf.Descriptors.Descriptor
|
||||
getDescriptor() {
|
||||
return net.osmand.binary.OsmandOdb.internal_static_OsmAndTileBox_descriptor;
|
||||
}
|
||||
|
||||
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||
internalGetFieldAccessorTable() {
|
||||
return net.osmand.binary.OsmandOdb.internal_static_OsmAndTileBox_fieldAccessorTable;
|
||||
}
|
||||
|
||||
// required uint32 left = 1;
|
||||
public static final int LEFT_FIELD_NUMBER = 1;
|
||||
private boolean hasLeft;
|
||||
private int left_ = 0;
|
||||
public boolean hasLeft() { return hasLeft; }
|
||||
public int getLeft() { return left_; }
|
||||
|
||||
// required uint32 right = 2;
|
||||
public static final int RIGHT_FIELD_NUMBER = 2;
|
||||
private boolean hasRight;
|
||||
private int right_ = 0;
|
||||
public boolean hasRight() { return hasRight; }
|
||||
public int getRight() { return right_; }
|
||||
|
||||
// required uint32 top = 3;
|
||||
public static final int TOP_FIELD_NUMBER = 3;
|
||||
private boolean hasTop;
|
||||
private int top_ = 0;
|
||||
public boolean hasTop() { return hasTop; }
|
||||
public int getTop() { return top_; }
|
||||
|
||||
// required uint32 bottom = 4;
|
||||
public static final int BOTTOM_FIELD_NUMBER = 4;
|
||||
private boolean hasBottom;
|
||||
private int bottom_ = 0;
|
||||
public boolean hasBottom() { return hasBottom; }
|
||||
public int getBottom() { return bottom_; }
|
||||
|
||||
private void initFields() {
|
||||
}
|
||||
public final boolean isInitialized() {
|
||||
if (!hasLeft) return false;
|
||||
if (!hasRight) return false;
|
||||
if (!hasTop) return false;
|
||||
if (!hasBottom) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void writeTo(com.google.protobuf.CodedOutputStream output)
|
||||
throws java.io.IOException {
|
||||
getSerializedSize();
|
||||
if (hasLeft()) {
|
||||
output.writeUInt32(1, getLeft());
|
||||
}
|
||||
if (hasRight()) {
|
||||
output.writeUInt32(2, getRight());
|
||||
}
|
||||
if (hasTop()) {
|
||||
output.writeUInt32(3, getTop());
|
||||
}
|
||||
if (hasBottom()) {
|
||||
output.writeUInt32(4, getBottom());
|
||||
}
|
||||
getUnknownFields().writeTo(output);
|
||||
}
|
||||
|
||||
private int memoizedSerializedSize = -1;
|
||||
public int getSerializedSize() {
|
||||
int size = memoizedSerializedSize;
|
||||
if (size != -1) return size;
|
||||
|
||||
size = 0;
|
||||
if (hasLeft()) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeUInt32Size(1, getLeft());
|
||||
}
|
||||
if (hasRight()) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeUInt32Size(2, getRight());
|
||||
}
|
||||
if (hasTop()) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeUInt32Size(3, getTop());
|
||||
}
|
||||
if (hasBottom()) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeUInt32Size(4, getBottom());
|
||||
}
|
||||
size += getUnknownFields().getSerializedSize();
|
||||
memoizedSerializedSize = size;
|
||||
return size;
|
||||
}
|
||||
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseFrom(
|
||||
com.google.protobuf.ByteString data)
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
return newBuilder().mergeFrom(data).buildParsed();
|
||||
}
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseFrom(
|
||||
com.google.protobuf.ByteString data,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
return newBuilder().mergeFrom(data, extensionRegistry)
|
||||
.buildParsed();
|
||||
}
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseFrom(byte[] data)
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
return newBuilder().mergeFrom(data).buildParsed();
|
||||
}
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseFrom(
|
||||
byte[] data,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
return newBuilder().mergeFrom(data, extensionRegistry)
|
||||
.buildParsed();
|
||||
}
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseFrom(java.io.InputStream input)
|
||||
throws java.io.IOException {
|
||||
return newBuilder().mergeFrom(input).buildParsed();
|
||||
}
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseFrom(
|
||||
java.io.InputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws java.io.IOException {
|
||||
return newBuilder().mergeFrom(input, extensionRegistry)
|
||||
.buildParsed();
|
||||
}
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseDelimitedFrom(java.io.InputStream input)
|
||||
throws java.io.IOException {
|
||||
Builder builder = newBuilder();
|
||||
if (builder.mergeDelimitedFrom(input)) {
|
||||
return builder.buildParsed();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseDelimitedFrom(
|
||||
java.io.InputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws java.io.IOException {
|
||||
Builder builder = newBuilder();
|
||||
if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
|
||||
return builder.buildParsed();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseFrom(
|
||||
com.google.protobuf.CodedInputStream input)
|
||||
throws java.io.IOException {
|
||||
return newBuilder().mergeFrom(input).buildParsed();
|
||||
}
|
||||
public static net.osmand.binary.OsmandOdb.OsmAndTileBox parseFrom(
|
||||
com.google.protobuf.CodedInputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws java.io.IOException {
|
||||
return newBuilder().mergeFrom(input, extensionRegistry)
|
||||
.buildParsed();
|
||||
}
|
||||
|
||||
public static Builder newBuilder() { return Builder.create(); }
|
||||
public Builder newBuilderForType() { return newBuilder(); }
|
||||
public static Builder newBuilder(net.osmand.binary.OsmandOdb.OsmAndTileBox prototype) {
|
||||
return newBuilder().mergeFrom(prototype);
|
||||
}
|
||||
public Builder toBuilder() { return newBuilder(this); }
|
||||
|
||||
public static final class Builder extends
|
||||
com.google.protobuf.GeneratedMessage.Builder<Builder> {
|
||||
private net.osmand.binary.OsmandOdb.OsmAndTileBox result;
|
||||
|
||||
// Construct using net.osmand.binary.OsmandOdb.OsmAndTileBox.newBuilder()
|
||||
private Builder() {}
|
||||
|
||||
private static Builder create() {
|
||||
Builder builder = new Builder();
|
||||
builder.result = new net.osmand.binary.OsmandOdb.OsmAndTileBox();
|
||||
return builder;
|
||||
}
|
||||
|
||||
protected net.osmand.binary.OsmandOdb.OsmAndTileBox internalGetResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public Builder clear() {
|
||||
if (result == null) {
|
||||
throw new IllegalStateException(
|
||||
"Cannot call clear() after build().");
|
||||
}
|
||||
result = new net.osmand.binary.OsmandOdb.OsmAndTileBox();
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder clone() {
|
||||
return create().mergeFrom(result);
|
||||
}
|
||||
|
||||
public com.google.protobuf.Descriptors.Descriptor
|
||||
getDescriptorForType() {
|
||||
return net.osmand.binary.OsmandOdb.OsmAndTileBox.getDescriptor();
|
||||
}
|
||||
|
||||
public net.osmand.binary.OsmandOdb.OsmAndTileBox getDefaultInstanceForType() {
|
||||
return net.osmand.binary.OsmandOdb.OsmAndTileBox.getDefaultInstance();
|
||||
}
|
||||
|
||||
public boolean isInitialized() {
|
||||
return result.isInitialized();
|
||||
}
|
||||
public net.osmand.binary.OsmandOdb.OsmAndTileBox build() {
|
||||
if (result != null && !isInitialized()) {
|
||||
throw newUninitializedMessageException(result);
|
||||
}
|
||||
return buildPartial();
|
||||
}
|
||||
|
||||
private net.osmand.binary.OsmandOdb.OsmAndTileBox buildParsed()
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
if (!isInitialized()) {
|
||||
throw newUninitializedMessageException(
|
||||
result).asInvalidProtocolBufferException();
|
||||
}
|
||||
return buildPartial();
|
||||
}
|
||||
|
||||
public net.osmand.binary.OsmandOdb.OsmAndTileBox buildPartial() {
|
||||
if (result == null) {
|
||||
throw new IllegalStateException(
|
||||
"build() has already been called on this Builder.");
|
||||
}
|
||||
net.osmand.binary.OsmandOdb.OsmAndTileBox returnMe = result;
|
||||
result = null;
|
||||
return returnMe;
|
||||
}
|
||||
|
||||
public Builder mergeFrom(com.google.protobuf.Message other) {
|
||||
if (other instanceof net.osmand.binary.OsmandOdb.OsmAndTileBox) {
|
||||
return mergeFrom((net.osmand.binary.OsmandOdb.OsmAndTileBox)other);
|
||||
} else {
|
||||
super.mergeFrom(other);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
public Builder mergeFrom(net.osmand.binary.OsmandOdb.OsmAndTileBox other) {
|
||||
if (other == net.osmand.binary.OsmandOdb.OsmAndTileBox.getDefaultInstance()) return this;
|
||||
if (other.hasLeft()) {
|
||||
setLeft(other.getLeft());
|
||||
}
|
||||
if (other.hasRight()) {
|
||||
setRight(other.getRight());
|
||||
}
|
||||
if (other.hasTop()) {
|
||||
setTop(other.getTop());
|
||||
}
|
||||
if (other.hasBottom()) {
|
||||
setBottom(other.getBottom());
|
||||
}
|
||||
this.mergeUnknownFields(other.getUnknownFields());
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder mergeFrom(
|
||||
com.google.protobuf.CodedInputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws java.io.IOException {
|
||||
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
|
||||
com.google.protobuf.UnknownFieldSet.newBuilder(
|
||||
this.getUnknownFields());
|
||||
while (true) {
|
||||
int tag = input.readTag();
|
||||
switch (tag) {
|
||||
case 0:
|
||||
this.setUnknownFields(unknownFields.build());
|
||||
return this;
|
||||
default: {
|
||||
if (!parseUnknownField(input, unknownFields,
|
||||
extensionRegistry, tag)) {
|
||||
this.setUnknownFields(unknownFields.build());
|
||||
return this;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 8: {
|
||||
setLeft(input.readUInt32());
|
||||
break;
|
||||
}
|
||||
case 16: {
|
||||
setRight(input.readUInt32());
|
||||
break;
|
||||
}
|
||||
case 24: {
|
||||
setTop(input.readUInt32());
|
||||
break;
|
||||
}
|
||||
case 32: {
|
||||
setBottom(input.readUInt32());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// required uint32 left = 1;
|
||||
public boolean hasLeft() {
|
||||
return result.hasLeft();
|
||||
}
|
||||
public int getLeft() {
|
||||
return result.getLeft();
|
||||
}
|
||||
public Builder setLeft(int value) {
|
||||
result.hasLeft = true;
|
||||
result.left_ = value;
|
||||
return this;
|
||||
}
|
||||
public Builder clearLeft() {
|
||||
result.hasLeft = false;
|
||||
result.left_ = 0;
|
||||
return this;
|
||||
}
|
||||
|
||||
// required uint32 right = 2;
|
||||
public boolean hasRight() {
|
||||
return result.hasRight();
|
||||
}
|
||||
public int getRight() {
|
||||
return result.getRight();
|
||||
}
|
||||
public Builder setRight(int value) {
|
||||
result.hasRight = true;
|
||||
result.right_ = value;
|
||||
return this;
|
||||
}
|
||||
public Builder clearRight() {
|
||||
result.hasRight = false;
|
||||
result.right_ = 0;
|
||||
return this;
|
||||
}
|
||||
|
||||
// required uint32 top = 3;
|
||||
public boolean hasTop() {
|
||||
return result.hasTop();
|
||||
}
|
||||
public int getTop() {
|
||||
return result.getTop();
|
||||
}
|
||||
public Builder setTop(int value) {
|
||||
result.hasTop = true;
|
||||
result.top_ = value;
|
||||
return this;
|
||||
}
|
||||
public Builder clearTop() {
|
||||
result.hasTop = false;
|
||||
result.top_ = 0;
|
||||
return this;
|
||||
}
|
||||
|
||||
// required uint32 bottom = 4;
|
||||
public boolean hasBottom() {
|
||||
return result.hasBottom();
|
||||
}
|
||||
public int getBottom() {
|
||||
return result.getBottom();
|
||||
}
|
||||
public Builder setBottom(int value) {
|
||||
result.hasBottom = true;
|
||||
result.bottom_ = value;
|
||||
return this;
|
||||
}
|
||||
public Builder clearBottom() {
|
||||
result.hasBottom = false;
|
||||
result.bottom_ = 0;
|
||||
return this;
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(builder_scope:OsmAndTileBox)
|
||||
}
|
||||
|
||||
static {
|
||||
defaultInstance = new OsmAndTileBox(true);
|
||||
net.osmand.binary.OsmandOdb.internalForceInit();
|
||||
defaultInstance.initFields();
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(class_scope:OsmAndTileBox)
|
||||
}
|
||||
|
||||
public static final class OsmAndPoiIndex extends
|
||||
com.google.protobuf.GeneratedMessage {
|
||||
// Use OsmAndPoiIndex.newBuilder() to construct.
|
||||
|
@ -10994,6 +11399,13 @@ public final class OsmandOdb {
|
|||
public boolean hasName() { return hasName; }
|
||||
public java.lang.String getName() { return name_; }
|
||||
|
||||
// required .OsmAndTileBox boundaries = 2;
|
||||
public static final int BOUNDARIES_FIELD_NUMBER = 2;
|
||||
private boolean hasBoundaries;
|
||||
private net.osmand.binary.OsmandOdb.OsmAndTileBox boundaries_;
|
||||
public boolean hasBoundaries() { return hasBoundaries; }
|
||||
public net.osmand.binary.OsmandOdb.OsmAndTileBox getBoundaries() { return boundaries_; }
|
||||
|
||||
// repeated .OsmAndCategoryTable categoriesTable = 3;
|
||||
public static final int CATEGORIESTABLE_FIELD_NUMBER = 3;
|
||||
private java.util.List<net.osmand.binary.OsmandOdb.OsmAndCategoryTable> categoriesTable_ =
|
||||
|
@ -11031,9 +11443,12 @@ public final class OsmandOdb {
|
|||
}
|
||||
|
||||
private void initFields() {
|
||||
boundaries_ = net.osmand.binary.OsmandOdb.OsmAndTileBox.getDefaultInstance();
|
||||
}
|
||||
public final boolean isInitialized() {
|
||||
if (!hasName) return false;
|
||||
if (!hasBoundaries) return false;
|
||||
if (!getBoundaries().isInitialized()) return false;
|
||||
for (net.osmand.binary.OsmandOdb.OsmAndCategoryTable element : getCategoriesTableList()) {
|
||||
if (!element.isInitialized()) return false;
|
||||
}
|
||||
|
@ -11052,6 +11467,9 @@ public final class OsmandOdb {
|
|||
if (hasName()) {
|
||||
output.writeString(1, getName());
|
||||
}
|
||||
if (hasBoundaries()) {
|
||||
output.writeMessage(2, getBoundaries());
|
||||
}
|
||||
for (net.osmand.binary.OsmandOdb.OsmAndCategoryTable element : getCategoriesTableList()) {
|
||||
output.writeMessage(3, element);
|
||||
}
|
||||
|
@ -11074,6 +11492,10 @@ public final class OsmandOdb {
|
|||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeStringSize(1, getName());
|
||||
}
|
||||
if (hasBoundaries()) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeMessageSize(2, getBoundaries());
|
||||
}
|
||||
for (net.osmand.binary.OsmandOdb.OsmAndCategoryTable element : getCategoriesTableList()) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeMessageSize(3, element);
|
||||
|
@ -11259,6 +11681,9 @@ public final class OsmandOdb {
|
|||
if (other.hasName()) {
|
||||
setName(other.getName());
|
||||
}
|
||||
if (other.hasBoundaries()) {
|
||||
mergeBoundaries(other.getBoundaries());
|
||||
}
|
||||
if (!other.categoriesTable_.isEmpty()) {
|
||||
if (result.categoriesTable_.isEmpty()) {
|
||||
result.categoriesTable_ = new java.util.ArrayList<net.osmand.binary.OsmandOdb.OsmAndCategoryTable>();
|
||||
|
@ -11306,6 +11731,15 @@ public final class OsmandOdb {
|
|||
setName(input.readString());
|
||||
break;
|
||||
}
|
||||
case 18: {
|
||||
net.osmand.binary.OsmandOdb.OsmAndTileBox.Builder subBuilder = net.osmand.binary.OsmandOdb.OsmAndTileBox.newBuilder();
|
||||
if (hasBoundaries()) {
|
||||
subBuilder.mergeFrom(getBoundaries());
|
||||
}
|
||||
input.readMessage(subBuilder, extensionRegistry);
|
||||
setBoundaries(subBuilder.buildPartial());
|
||||
break;
|
||||
}
|
||||
case 26: {
|
||||
net.osmand.binary.OsmandOdb.OsmAndCategoryTable.Builder subBuilder = net.osmand.binary.OsmandOdb.OsmAndCategoryTable.newBuilder();
|
||||
input.readMessage(subBuilder, extensionRegistry);
|
||||
|
@ -11350,6 +11784,43 @@ public final class OsmandOdb {
|
|||
return this;
|
||||
}
|
||||
|
||||
// required .OsmAndTileBox boundaries = 2;
|
||||
public boolean hasBoundaries() {
|
||||
return result.hasBoundaries();
|
||||
}
|
||||
public net.osmand.binary.OsmandOdb.OsmAndTileBox getBoundaries() {
|
||||
return result.getBoundaries();
|
||||
}
|
||||
public Builder setBoundaries(net.osmand.binary.OsmandOdb.OsmAndTileBox value) {
|
||||
if (value == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
result.hasBoundaries = true;
|
||||
result.boundaries_ = value;
|
||||
return this;
|
||||
}
|
||||
public Builder setBoundaries(net.osmand.binary.OsmandOdb.OsmAndTileBox.Builder builderForValue) {
|
||||
result.hasBoundaries = true;
|
||||
result.boundaries_ = builderForValue.build();
|
||||
return this;
|
||||
}
|
||||
public Builder mergeBoundaries(net.osmand.binary.OsmandOdb.OsmAndTileBox value) {
|
||||
if (result.hasBoundaries() &&
|
||||
result.boundaries_ != net.osmand.binary.OsmandOdb.OsmAndTileBox.getDefaultInstance()) {
|
||||
result.boundaries_ =
|
||||
net.osmand.binary.OsmandOdb.OsmAndTileBox.newBuilder(result.boundaries_).mergeFrom(value).buildPartial();
|
||||
} else {
|
||||
result.boundaries_ = value;
|
||||
}
|
||||
result.hasBoundaries = true;
|
||||
return this;
|
||||
}
|
||||
public Builder clearBoundaries() {
|
||||
result.hasBoundaries = false;
|
||||
result.boundaries_ = net.osmand.binary.OsmandOdb.OsmAndTileBox.getDefaultInstance();
|
||||
return this;
|
||||
}
|
||||
|
||||
// repeated .OsmAndCategoryTable categoriesTable = 3;
|
||||
public java.util.List<net.osmand.binary.OsmandOdb.OsmAndCategoryTable> getCategoriesTableList() {
|
||||
return java.util.Collections.unmodifiableList(result.categoriesTable_);
|
||||
|
@ -14601,6 +15072,11 @@ public final class OsmandOdb {
|
|||
private static
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||
internal_static_OsmAndTransportIndex_fieldAccessorTable;
|
||||
private static com.google.protobuf.Descriptors.Descriptor
|
||||
internal_static_OsmAndTileBox_descriptor;
|
||||
private static
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||
internal_static_OsmAndTileBox_fieldAccessorTable;
|
||||
private static com.google.protobuf.Descriptors.Descriptor
|
||||
internal_static_OsmAndPoiIndex_descriptor;
|
||||
private static
|
||||
|
@ -14710,29 +15186,32 @@ public final class OsmandOdb {
|
|||
"\024OsmAndTransportIndex\022\014\n\004name\030\001 \001(\t\022 \n\006r" +
|
||||
"outes\030\003 \001(\0132\020.TransportRoutes\022\"\n\005stops\030\006" +
|
||||
" \001(\0132\023.TransportStopsTree\022!\n\013stringTable" +
|
||||
"\030\t \002(\0132\014.StringTable\"\217\001\n\016OsmAndPoiIndex\022" +
|
||||
"\014\n\004name\030\001 \002(\t\022-\n\017categoriesTable\030\003 \003(\0132\024" +
|
||||
".OsmAndCategoryTable\022\034\n\005boxes\030\006 \003(\0132\r.Os" +
|
||||
"mAndPoiBox\022\"\n\007poiData\030\t \003(\0132\021.OsmAndPoiB" +
|
||||
"oxData\"W\n\022IndexedStringTable\022\016\n\006prefix\030\001",
|
||||
" \001(\t\022\t\n\001s\030\003 \003(\t\022&\n\tsubtables\030\006 \003(\0132\023.Ind" +
|
||||
"exedStringTable\">\n\023OsmAndCategoryTable\022\020" +
|
||||
"\n\010category\030\001 \002(\t\022\025\n\rsubcategories\030\003 \003(\t\"" +
|
||||
"\365\001\n\014OsmAndPoiBox\022\014\n\004zoom\030\001 \002(\r\022\014\n\004left\030\002" +
|
||||
" \002(\021\022\013\n\003top\030\003 \002(\021\022(\n\ncategories\030\004 \001(\0132\024." +
|
||||
"OsmAndPoiCategories\022-\n\020includeNamesList\030" +
|
||||
"\005 \001(\0132\023.IndexedStringTable\022-\n\020excludeNam" +
|
||||
"esList\030\006 \001(\0132\023.IndexedStringTable\022\037\n\010sub" +
|
||||
"Boxes\030\n \003(\0132\r.OsmAndPoiBox\022\023\n\013shiftToDat" +
|
||||
"a\030\016 \001(\007\")\n\023OsmAndPoiCategories\022\022\n\ncatego",
|
||||
"ries\030\003 \003(\r\"^\n\020OsmAndPoiBoxData\022\014\n\004zoom\030\001" +
|
||||
" \001(\r\022\t\n\001x\030\002 \001(\r\022\t\n\001y\030\003 \001(\r\022&\n\007poiData\030\005 " +
|
||||
"\003(\0132\025.OsmAndPoiBoxDataAtom\"\255\001\n\024OsmAndPoi" +
|
||||
"BoxDataAtom\022\n\n\002dx\030\002 \002(\021\022\n\n\002dy\030\003 \002(\021\022\n\n\002i" +
|
||||
"d\030\004 \001(\004\022\014\n\004name\030\005 \001(\t\022\016\n\006nameEn\030\006 \001(\t\022\022\n" +
|
||||
"\ncategories\030\007 \003(\r\022\024\n\014openingHours\030\n \001(\t\022" +
|
||||
"\014\n\004site\030\013 \001(\t\022\r\n\005phone\030\014 \001(\t\022\014\n\004note\030\r \001" +
|
||||
"(\tB\023\n\021net.osmand.binary"
|
||||
"\030\t \002(\0132\014.StringTable\"I\n\rOsmAndTileBox\022\014\n" +
|
||||
"\004left\030\001 \002(\r\022\r\n\005right\030\002 \002(\r\022\013\n\003top\030\003 \002(\r\022" +
|
||||
"\016\n\006bottom\030\004 \002(\r\"\263\001\n\016OsmAndPoiIndex\022\014\n\004na" +
|
||||
"me\030\001 \002(\t\022\"\n\nboundaries\030\002 \002(\0132\016.OsmAndTil" +
|
||||
"eBox\022-\n\017categoriesTable\030\003 \003(\0132\024.OsmAndCa",
|
||||
"tegoryTable\022\034\n\005boxes\030\006 \003(\0132\r.OsmAndPoiBo" +
|
||||
"x\022\"\n\007poiData\030\t \003(\0132\021.OsmAndPoiBoxData\"W\n" +
|
||||
"\022IndexedStringTable\022\016\n\006prefix\030\001 \001(\t\022\t\n\001s" +
|
||||
"\030\003 \003(\t\022&\n\tsubtables\030\006 \003(\0132\023.IndexedStrin" +
|
||||
"gTable\">\n\023OsmAndCategoryTable\022\020\n\010categor" +
|
||||
"y\030\001 \002(\t\022\025\n\rsubcategories\030\003 \003(\t\"\365\001\n\014OsmAn" +
|
||||
"dPoiBox\022\014\n\004zoom\030\001 \002(\r\022\014\n\004left\030\002 \002(\021\022\013\n\003t" +
|
||||
"op\030\003 \002(\021\022(\n\ncategories\030\004 \001(\0132\024.OsmAndPoi" +
|
||||
"Categories\022-\n\020includeNamesList\030\005 \001(\0132\023.I" +
|
||||
"ndexedStringTable\022-\n\020excludeNamesList\030\006 ",
|
||||
"\001(\0132\023.IndexedStringTable\022\037\n\010subBoxes\030\n \003" +
|
||||
"(\0132\r.OsmAndPoiBox\022\023\n\013shiftToData\030\016 \001(\007\")" +
|
||||
"\n\023OsmAndPoiCategories\022\022\n\ncategories\030\003 \003(" +
|
||||
"\r\"^\n\020OsmAndPoiBoxData\022\014\n\004zoom\030\001 \001(\r\022\t\n\001x" +
|
||||
"\030\002 \001(\r\022\t\n\001y\030\003 \001(\r\022&\n\007poiData\030\005 \003(\0132\025.Osm" +
|
||||
"AndPoiBoxDataAtom\"\255\001\n\024OsmAndPoiBoxDataAt" +
|
||||
"om\022\n\n\002dx\030\002 \002(\021\022\n\n\002dy\030\003 \002(\021\022\n\n\002id\030\004 \001(\004\022\014" +
|
||||
"\n\004name\030\005 \001(\t\022\016\n\006nameEn\030\006 \001(\t\022\022\n\ncategori" +
|
||||
"es\030\007 \003(\r\022\024\n\014openingHours\030\n \001(\t\022\014\n\004site\030\013" +
|
||||
" \001(\t\022\r\n\005phone\030\014 \001(\t\022\014\n\004note\030\r \001(\tB\023\n\021net",
|
||||
".osmand.binary"
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||
|
@ -14915,16 +15394,24 @@ public final class OsmandOdb {
|
|||
new java.lang.String[] { "Name", "Routes", "Stops", "StringTable", },
|
||||
net.osmand.binary.OsmandOdb.OsmAndTransportIndex.class,
|
||||
net.osmand.binary.OsmandOdb.OsmAndTransportIndex.Builder.class);
|
||||
internal_static_OsmAndPoiIndex_descriptor =
|
||||
internal_static_OsmAndTileBox_descriptor =
|
||||
getDescriptor().getMessageTypes().get(22);
|
||||
internal_static_OsmAndTileBox_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_OsmAndTileBox_descriptor,
|
||||
new java.lang.String[] { "Left", "Right", "Top", "Bottom", },
|
||||
net.osmand.binary.OsmandOdb.OsmAndTileBox.class,
|
||||
net.osmand.binary.OsmandOdb.OsmAndTileBox.Builder.class);
|
||||
internal_static_OsmAndPoiIndex_descriptor =
|
||||
getDescriptor().getMessageTypes().get(23);
|
||||
internal_static_OsmAndPoiIndex_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_OsmAndPoiIndex_descriptor,
|
||||
new java.lang.String[] { "Name", "CategoriesTable", "Boxes", "PoiData", },
|
||||
new java.lang.String[] { "Name", "Boundaries", "CategoriesTable", "Boxes", "PoiData", },
|
||||
net.osmand.binary.OsmandOdb.OsmAndPoiIndex.class,
|
||||
net.osmand.binary.OsmandOdb.OsmAndPoiIndex.Builder.class);
|
||||
internal_static_IndexedStringTable_descriptor =
|
||||
getDescriptor().getMessageTypes().get(23);
|
||||
getDescriptor().getMessageTypes().get(24);
|
||||
internal_static_IndexedStringTable_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_IndexedStringTable_descriptor,
|
||||
|
@ -14932,7 +15419,7 @@ public final class OsmandOdb {
|
|||
net.osmand.binary.OsmandOdb.IndexedStringTable.class,
|
||||
net.osmand.binary.OsmandOdb.IndexedStringTable.Builder.class);
|
||||
internal_static_OsmAndCategoryTable_descriptor =
|
||||
getDescriptor().getMessageTypes().get(24);
|
||||
getDescriptor().getMessageTypes().get(25);
|
||||
internal_static_OsmAndCategoryTable_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_OsmAndCategoryTable_descriptor,
|
||||
|
@ -14940,7 +15427,7 @@ public final class OsmandOdb {
|
|||
net.osmand.binary.OsmandOdb.OsmAndCategoryTable.class,
|
||||
net.osmand.binary.OsmandOdb.OsmAndCategoryTable.Builder.class);
|
||||
internal_static_OsmAndPoiBox_descriptor =
|
||||
getDescriptor().getMessageTypes().get(25);
|
||||
getDescriptor().getMessageTypes().get(26);
|
||||
internal_static_OsmAndPoiBox_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_OsmAndPoiBox_descriptor,
|
||||
|
@ -14948,7 +15435,7 @@ public final class OsmandOdb {
|
|||
net.osmand.binary.OsmandOdb.OsmAndPoiBox.class,
|
||||
net.osmand.binary.OsmandOdb.OsmAndPoiBox.Builder.class);
|
||||
internal_static_OsmAndPoiCategories_descriptor =
|
||||
getDescriptor().getMessageTypes().get(26);
|
||||
getDescriptor().getMessageTypes().get(27);
|
||||
internal_static_OsmAndPoiCategories_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_OsmAndPoiCategories_descriptor,
|
||||
|
@ -14956,7 +15443,7 @@ public final class OsmandOdb {
|
|||
net.osmand.binary.OsmandOdb.OsmAndPoiCategories.class,
|
||||
net.osmand.binary.OsmandOdb.OsmAndPoiCategories.Builder.class);
|
||||
internal_static_OsmAndPoiBoxData_descriptor =
|
||||
getDescriptor().getMessageTypes().get(27);
|
||||
getDescriptor().getMessageTypes().get(28);
|
||||
internal_static_OsmAndPoiBoxData_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_OsmAndPoiBoxData_descriptor,
|
||||
|
@ -14964,7 +15451,7 @@ public final class OsmandOdb {
|
|||
net.osmand.binary.OsmandOdb.OsmAndPoiBoxData.class,
|
||||
net.osmand.binary.OsmandOdb.OsmAndPoiBoxData.Builder.class);
|
||||
internal_static_OsmAndPoiBoxDataAtom_descriptor =
|
||||
getDescriptor().getMessageTypes().get(28);
|
||||
getDescriptor().getMessageTypes().get(29);
|
||||
internal_static_OsmAndPoiBoxDataAtom_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_OsmAndPoiBoxDataAtom_descriptor,
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.util.TreeMap;
|
|||
import net.osmand.Algoritms;
|
||||
import net.osmand.IProgress;
|
||||
import net.osmand.binary.BinaryMapIndexWriter;
|
||||
import net.osmand.binary.BinaryMapPoiReaderAdapter;
|
||||
import net.osmand.data.Amenity;
|
||||
import net.osmand.data.AmenityType;
|
||||
import net.osmand.data.IndexConstants;
|
||||
|
@ -41,9 +42,9 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
|||
private Connection poiConnection;
|
||||
private File poiIndexFile;
|
||||
private PreparedStatement poiPreparedStatement;
|
||||
private static final int ZOOM_TO_SAVE_END = 15;
|
||||
private static final int ZOOM_TO_SAVE_END = 16;
|
||||
private static final int ZOOM_TO_SAVE_START = 6;
|
||||
private static final int SHIFT_BYTES_CATEGORY = 7;
|
||||
|
||||
|
||||
private List<Amenity> tempAmenityList = new ArrayList<Amenity>();
|
||||
|
||||
|
@ -167,7 +168,7 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
|||
if (subcatInd == null) {
|
||||
throw new IllegalArgumentException("Unknown subcategory " + sub + " category " + category);
|
||||
}
|
||||
types.add((subcatInd << SHIFT_BYTES_CATEGORY) | catInd);
|
||||
types.add((subcatInd << BinaryMapPoiReaderAdapter.SHIFT_BITS_CATEGORY) | catInd);
|
||||
}
|
||||
} else {
|
||||
subcategory = subcategory.trim();
|
||||
|
@ -175,7 +176,7 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
|||
if (subcatInd == null) {
|
||||
throw new IllegalArgumentException("Unknown subcategory " + subcategory + " category " + category);
|
||||
}
|
||||
types.add((subcatInd << SHIFT_BYTES_CATEGORY) | catInd);
|
||||
types.add((subcatInd << BinaryMapPoiReaderAdapter.SHIFT_BITS_CATEGORY) | catInd);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -208,7 +209,14 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
|||
stat.close();
|
||||
|
||||
// 1. write header
|
||||
long startFpPoiIndex = writer.startWritePOIIndex(regionName);
|
||||
rs = poiConnection.createStatement().executeQuery("SELECT max(x), min(x), max(y), min(y) FROM poi");
|
||||
rs.next();
|
||||
int right31 = rs.getInt(1);
|
||||
int left31 = rs.getInt(2);
|
||||
int bottom31 = rs.getInt(3);
|
||||
int top31 = rs.getInt(4);
|
||||
rs.close();
|
||||
long startFpPoiIndex = writer.startWritePOIIndex(regionName, left31, right31, bottom31, top31);
|
||||
|
||||
// 2. write categories table
|
||||
Map<String, Integer> catIndexes = writer.writePOICategoriesTable(categories);
|
||||
|
@ -309,8 +317,9 @@ public class IndexPoiCreator extends AbstractIndexPartCreator {
|
|||
long l = tree.getNode();
|
||||
int x = (int) (l >> 31);
|
||||
int y = (int) (l & ((1 << 31) - 1));
|
||||
long fp = writer.startWritePoiBox(zoom, x, y);
|
||||
if (zoom < ZOOM_TO_SAVE_END) {
|
||||
boolean end = zoom == ZOOM_TO_SAVE_END;
|
||||
long fp = writer.startWritePoiBox(zoom, x, y, end);
|
||||
if (!end) {
|
||||
for (Tree<Long> subTree : tree.getSubtrees()) {
|
||||
writePoiBoxes(writer, subTree, zoom + 1, fpToWriteSeeks);
|
||||
}
|
||||
|
|
|
@ -258,10 +258,20 @@ message OsmAndTransportIndex {
|
|||
|
||||
}
|
||||
|
||||
message OsmAndTileBox {
|
||||
// everything is encoded as 31 tile zoom
|
||||
required uint32 left = 1;
|
||||
required uint32 right = 2;
|
||||
required uint32 top = 3;
|
||||
required uint32 bottom = 4;
|
||||
|
||||
}
|
||||
|
||||
message OsmAndPoiIndex {
|
||||
required string name = 1;
|
||||
|
||||
required OsmAndTileBox boundaries = 2;
|
||||
|
||||
repeated OsmAndCategoryTable categoriesTable = 3;
|
||||
|
||||
// leave space for other indexes
|
||||
|
|
|
@ -8,11 +8,8 @@ import java.util.List;
|
|||
|
||||
import net.osmand.Algoritms;
|
||||
import net.osmand.LogUtil;
|
||||
import net.osmand.binary.BinaryIndexPart;
|
||||
import net.osmand.binary.BinaryMapDataObject;
|
||||
import net.osmand.binary.BinaryMapIndexReader;
|
||||
import net.osmand.binary.BinaryMapIndexReader.MapIndex;
|
||||
import net.osmand.binary.BinaryMapIndexReader.MapRoot;
|
||||
import net.osmand.binary.BinaryMapIndexReader.SearchFilter;
|
||||
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
|
||||
import net.osmand.binary.BinaryMapIndexReader.TagValuePair;
|
||||
|
@ -21,7 +18,6 @@ import net.osmand.data.AmenityType;
|
|||
import net.osmand.osm.LatLon;
|
||||
import net.osmand.osm.MapRenderingTypes;
|
||||
import net.osmand.osm.MapUtils;
|
||||
import net.sf.junidecode.Junidecode;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
|
@ -46,45 +42,12 @@ public class AmenityIndexRepositoryBinary implements AmenityIndexRepository {
|
|||
|
||||
@Override
|
||||
public boolean checkContains(double latitude, double longitude) {
|
||||
int x = MapUtils.get31TileNumberX(longitude);
|
||||
int y = MapUtils.get31TileNumberY(latitude);
|
||||
for(BinaryIndexPart i : index.getIndexes()){
|
||||
if(i instanceof MapIndex){
|
||||
List<MapRoot> rs = ((MapIndex) i).getRoots();
|
||||
if(!rs.isEmpty()){
|
||||
MapRoot rt = rs.get(0);
|
||||
if(rt.getLeft() <= x && rt.getRight() >= x &&
|
||||
rt.getTop() <= y && rt.getBottom() >= y){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return index.containsPoiData(latitude, longitude);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkContains(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude) {
|
||||
int leftX = MapUtils.get31TileNumberX(leftLongitude);
|
||||
int rightX = MapUtils.get31TileNumberX(rightLongitude);
|
||||
int bottomY = MapUtils.get31TileNumberY(bottomLatitude);
|
||||
int topY = MapUtils.get31TileNumberY(topLatitude);
|
||||
for(BinaryIndexPart i : index.getIndexes()){
|
||||
if(i instanceof MapIndex){
|
||||
List<MapRoot> rs = ((MapIndex) i).getRoots();
|
||||
if(!rs.isEmpty()){
|
||||
MapRoot rt = rs.get(0);
|
||||
if(rightX < rt.getLeft() || leftX > rt.getRight()){
|
||||
continue;
|
||||
}
|
||||
if(topY > rt.getBottom() || bottomY < rt.getTop()){
|
||||
continue;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return index.containsPoiData(topLatitude, leftLongitude, bottomLatitude, rightLongitude);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -96,7 +59,8 @@ public class AmenityIndexRepositoryBinary implements AmenityIndexRepository {
|
|||
int sbottom = MapUtils.get31TileNumberY(bottomLatitude);
|
||||
int stop = MapUtils.get31TileNumberY(topLatitude);
|
||||
|
||||
SearchRequest<BinaryMapDataObject> req = BinaryMapIndexReader.buildSearchRequest(sleft, sright, stop, sbottom, 16);
|
||||
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(sleft, sright, stop, sbottom, 16);
|
||||
// TODO types and filter and live results
|
||||
req.setSearchFilter(new SearchFilter(){
|
||||
|
||||
@Override
|
||||
|
@ -115,46 +79,13 @@ public class AmenityIndexRepositoryBinary implements AmenityIndexRepository {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
try {
|
||||
index.searchMapIndex(req);
|
||||
for(BinaryMapDataObject o : req.getSearchResults()){
|
||||
if(o.getPointsLength() == 0){
|
||||
continue;
|
||||
List<Amenity> result = index.searchPoi(req);
|
||||
for(Amenity am : result){
|
||||
if(filter.acceptTypeSubtype(am.getType(), am.getSubType())){
|
||||
amenities.add(am);
|
||||
}
|
||||
|
||||
int xTile = 0;
|
||||
int yTile = 0;
|
||||
for(int i=0; i<o.getPointsLength();i++){
|
||||
xTile += o.getPoint31XTile(i);
|
||||
yTile += o.getPoint31YTile(i);
|
||||
}
|
||||
double lat = MapUtils.get31LatitudeY(yTile/o.getPointsLength());
|
||||
double lon = MapUtils.get31LongitudeX(xTile/o.getPointsLength());
|
||||
|
||||
|
||||
for (int j = 0; j < o.getTypes().length; j++) {
|
||||
TagValuePair pair = o.getMapIndex().decodeType(o.getTypes()[j]);
|
||||
if(pair != null){
|
||||
Amenity am = new Amenity();
|
||||
am.setId(o.getId());
|
||||
am.setLocation(lat, lon);
|
||||
am.setName(o.getName());
|
||||
am.setEnName(Junidecode.unidecode(am.getName()));
|
||||
AmenityType type = MapRenderingTypes.getAmenityType(pair.tag, pair.value);
|
||||
String subtype = MapRenderingTypes.getAmenitySubtype(pair.tag, pair.value);
|
||||
am.setType(type);
|
||||
am.setSubType(subtype);
|
||||
am.setOpeningHours(null);
|
||||
am.setPhone(null);
|
||||
am.setSite(null);
|
||||
amenities.add(am);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("Error searching amenities", e); //$NON-NLS-1$
|
||||
|
|
|
@ -474,15 +474,14 @@ public class ResourceManager {
|
|||
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_not_supported), f.getName())); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
// that's not fully acceptable
|
||||
// TODO
|
||||
// try {
|
||||
// RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$
|
||||
// amenityRepositories.add(new AmenityIndexRepositoryBinary(new BinaryMapIndexReader(raf)));
|
||||
// } catch (IOException e) {
|
||||
// log.error("Exception reading " + f.getAbsolutePath(), e); //$NON-NLS-1$
|
||||
// warnings.add(MessageFormat.format(Messages.getMessage("version_index_is_not_supported"), f.getName())); //$NON-NLS-1$
|
||||
// }
|
||||
if(index.containsPoiData())
|
||||
try {
|
||||
RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$
|
||||
amenityRepositories.add(new AmenityIndexRepositoryBinary(new BinaryMapIndexReader(raf)));
|
||||
} catch (IOException e) {
|
||||
log.error("Exception reading " + f.getAbsolutePath(), e); //$NON-NLS-1$
|
||||
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_not_supported), f.getName())); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SQLiteException e) {
|
||||
|
|
Loading…
Reference in a new issue