[core] implement queryRenderedFeatures

This commit is contained in:
Ansis Brammanis
2016-04-05 16:27:37 -07:00
committed by John Firebaugh
parent 25442a77be
commit 61d14089e0
51 changed files with 1295 additions and 179 deletions

View File

@@ -50,6 +50,7 @@ NAN_MODULE_INIT(NodeMap::Init) {
Nan::SetPrototypeMethod(tpl, "render", Render);
Nan::SetPrototypeMethod(tpl, "release", Release);
Nan::SetPrototypeMethod(tpl, "dumpDebugLogs", DumpDebugLogs);
Nan::SetPrototypeMethod(tpl, "queryRenderedFeatures", QueryRenderedFeatures);
constructor.Reset(tpl->GetFunction());
Nan::Set(target, Nan::New("Map").ToLocalChecked(), tpl->GetFunction());
@@ -448,6 +449,55 @@ NAN_METHOD(NodeMap::DumpDebugLogs) {
info.GetReturnValue().SetUndefined();
}
NAN_METHOD(NodeMap::QueryRenderedFeatures) {
auto nodeMap = Nan::ObjectWrap::Unwrap<NodeMap>(info.Holder());
Nan::HandleScope scope;
if (!nodeMap->isValid()) return Nan::ThrowError(releasedMessage());
if (info.Length() <= 0 || !info[0]->IsArray()) {
return Nan::ThrowTypeError("First argument must be an array");
}
auto posOrBox = info[0].As<v8::Array>();
if (posOrBox->Length() != 2) {
return Nan::ThrowTypeError("First argument must have two components");
}
try {
std::vector<std::string> result;
if (Nan::Get(posOrBox, 0).ToLocalChecked()->IsArray()) {
auto pos0 = Nan::Get(posOrBox, 0).ToLocalChecked().As<v8::Array>();
auto pos1 = Nan::Get(posOrBox, 1).ToLocalChecked().As<v8::Array>();
std::array<mbgl::ScreenCoordinate, 2> queryBox = {{{
Nan::Get(pos0, 0).ToLocalChecked()->NumberValue(),
Nan::Get(pos0, 1).ToLocalChecked()->NumberValue()
}, {
Nan::Get(pos1, 0).ToLocalChecked()->NumberValue(),
Nan::Get(pos1, 1).ToLocalChecked()->NumberValue()
}}};
result = nodeMap->map->queryRenderedFeatures(queryBox);
} else {
mbgl::ScreenCoordinate queryPoint(
Nan::Get(posOrBox, 0).ToLocalChecked()->NumberValue(),
Nan::Get(posOrBox, 1).ToLocalChecked()->NumberValue());
result = nodeMap->map->queryRenderedFeatures(queryPoint);
}
auto array = Nan::New<v8::Array>();
for (unsigned int i = 0; i < result.size(); i++) {
array->Set(i, Nan::New<v8::String>(result[i]).ToLocalChecked());
}
info.GetReturnValue().Set(array);
} catch (const std::exception &ex) {
return Nan::ThrowError(ex.what());
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
// Instance