2013-07-15 2 views
2

Я создаю приложение C#, которое использует плагин Google Earth через элемент управления веб-браузера. Как часть приложения, мне нужно иметь возможность создавать многоэкранный флажок вокруг определенной области на земном шаре (подумайте, что-то похожее на перетаскивание нескольких файлов в вашем браузере файлов).Попытка создать поле выбора группы в плагине Google Планета Земля

Путь, который я установил прямо сейчас, код C# отслеживает, когда я нахожусь в режиме выбора, если я есть, первый щелчок левой кнопкой мыши тянет длинную часть этой точки от плагина google earth. После этого курсор мыши получить лат длиной в противоположном углу, а затем C# код вызывает следующие 2 JavaScript функции:

function clearHighlightBox(){ 
    var placemark = ge.getElementById('DARTselectBox'); 
    if(placemark) 
    { 
     ge.getFeatures().removeChild(placemark); 
    } 
} 

function setHighlightBox(lat1, long1, lat2, long2){ 
    clearHighlightBox(); 
    var placemark = ge.createPlacemark('DARTselectBox'); 
    var lineString = ge.createLineString(''); 
    var coords = lineString.getCoordinates(); 
    coords.pushLatLngAlt(lat1, long1, 5000); 
    coords.pushLatLngAlt(lat1, long2, 5000); 
    coords.pushLatLngAlt(lat2, long2, 5000); 
    coords.pushLatLngAlt(lat2, long1, 5000); 
    coords.pushLatLngAlt(lat1, long1, 5000); 
    placemark.setGeometry(lineString); 
    ge.getFeatures().appendChild(placemark); 
} 

Во-первых, создание идентификатора для метках таким образом, кажется, не работает (ge.createPlacemark ('DARTselectBox');). Если я отключу это, чтобы очистить все и удалить ID из вызова Createmark, это, по крайней мере, не сбой. Однако, даже когда я это делаю, я вижу только правую вертикальную ветвь моего прямоугольника.

ответ

1

Если я включаю это, чтобы очистить все и удалить идентификатор из создать вызов, Метка это по крайней мере не откажет.

Проблема в том, что вы не можете удалить, а затем быстро добавить объект с тем же идентификатором. Проще говоря, это вызов ge.createPlacemark('DARTselectBox'), который вызывает сбой, поскольку идентификатор DARTselectBox по-прежнему используется внутренне. Вы можете в конечном итоге использовать его снова, но время зависит от коллекции мусора элемента управления WebBrowser.

Чтобы избежать сбоя, вы можете попробовать calling release на отметке, чтобы идентификатор был немедленно освобожден. Посмотрите это замечание о том, что делает вызов release (Моего акцент)

Постоянно удаляет объект, позволяющего его идентификатор для повторного использования. Попытка доступа к объекту после его освобождения приведет к ошибке .

Если вы не можете просто переключать видимое состояние метки, а не добавлять и удалять ее каждый раз.

Действительная проблема с повторным использованием ID перечислен как ошибка и есть некоторые more information on the problem here

Edit:

Глядя на это похоже, что может быть ошибка с методом высвобождения.

Если вы прочтете ссылку, которую я разместил code.google.com/p/earth-api-samples/issues/detail?id=253, некоторые из комментариев внизу показывают это.

Во всяком случае, хеш будет работать, так же как и счетчик инкремента. Но я не понимаю, почему вы не просто устанавливаете видимость на false, либо создаете метку без идентификатора вообще и просто держите ссылку на нее во время операции.

Проблема с дисплеем, возможно, связана с режимом тесселяции и высоты.

Попробуйте вызвать setTessellate(true) на объекте геометрии меток, а также убедитесь, что режим высоты установлен на clampToGround - сделать это вы называете setAltitudeMode(ge.ALTITUDE_CLAMP_TO_GROUND) - снова на объекте геометрии меток.

Так у вас есть

var lineString = ge.createLineString(''); 
lineString.getCoordinates().pushLatLngAlt(...); 
lineString.setTessellate(true); 
lineString.setAltitudeMode(ge.ALTITUDE_CLAMP_TO_GROUND); 

Если это не работает, вы можете попытаться повернуть слой местности выключен и проверить, если линии там или нет?

Кроме того, я написал бесплатную библиотеку управления, которая делает много с API - это GPL, поэтому вы можете использовать ее в значительной степени, как вам нравится. Он охватывает множество вещей, подобных этому. http://code.google.com/p/winforms-geplugin-control-library/

+1

Я попробовал как раз высвободить метку, так и удалить ее по-прежнему, а затем отпустить ее. Ни один из них не работал. Я думаю, что мне просто нужно изменить идентификатор, чтобы быть каким-то хэшем времени и просто хранить все, что было раньше. – pquest

+1

В конце концов я просто держал ссылку на метку. Это работало лучше всего. Так что эта часть решена, но я все еще не уверен, почему метка не будет отображаться должным образом. – pquest

+1

Хорошо, я отвечу на проблему с отображением в редактировании моего ответа. – Fraser

-1

У меня есть приложение, которое делает что-то очень похожее. К сожалению, код не GPL, поэтому я не могу его выпустить. В общем, ваш подход правильный, но я считаю, что ваша проблема - это структура, которую вы используете для создания своего ящика.

Вам необходимо либо использовать четыре отдельных объекта KmlLineString (один для края кеша), либо KmlLinearRing, чтобы создать закрытую коробку. Я не считаю, что KmlLineString был разработан для создания замкнутого многоугольника, для чего используется линейное кольцо.

То, как вы вычисляете свои очки, выглядит хорошо для меня (сравнивая его с моим рабочим решением), поэтому я думаю, что если вы просто поменяете createLineString на createLinearRing, вам будет хорошо на вашем пути.

Образцы Google находятся по ссылке ниже. Вы увидите, что они используют linearRing для прилагаемого многоугольника. (Примерно на полпути вниз страницы)

https://developers.google.com/earth/documentation/geometries

+0

Я должен был упомянуть об этом раньше, но я попробовал это, используя как LineString, так и LinearRing. Результат тот же. – pquest