Как я могу нарисовать кружком на моем приложении Bing Map вокруг центральной точки с радиусом, приведенным в милях -- c# поле с участием map поле с участием bing-maps поле с участием geometry пол Связанный проблема

How do I draw a circle on my Bing Map application around a centerpoint with a radius given in miles


1
vote

проблема

русский

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

Я использую API Bing Maps. Я хочу нарисовать круг в данные мили (расстояние) от центра, который был передан через параметр, другая переменная в параметре, называемых MILES, просто удерживает двойное значение 1d. Я думаю, что проблема связана с тем, как рассчитывается моя математика. Кто-нибудь получил подсказку на том, как я могу уточнить этот код, чтобы рассчитать мои мили.

 <код> private void drawPoly(SearchLocation center, Double miles) { //amount of vertex double vertexCount = 100D;          //used by the api to carried out searches List<SearchLocation> vertices = new List<SearchLocation>(); double v = 0; double radians = Math.PI / 180D; double radiansPerDegree = Math.PI / 180D; double degreePerVertex = 360D / vertexCount; double radiansPerVertex = degreePerVertex * radiansPerDegree; var centerOfMap = center; const double degLatMiles = 68.68637156368D; double degLonMiles = Math.Cos(center.Latitude.Value) * (68.68637156368D); double milesLat = (miles * degLatMiles) / 3600; double milesLon = (miles * degLonMiles) / 3600; for (v = 0; v < vertexCount; v++) {     radians = v * radiansPerVertex;                //adds the miles from the center point and draws a circle     double centrLat = center.Latitude.Value + (milesLat * Math.Sin(radians));     double centrLon = center.Longitude.Value + (milesLon * Math.Cos(radians));     vertices.Add(new SearchLocation() { Latitude = centrLat, Longitude = centrLon }); }   
Английский оригинал

I have been able to draw an ellipse on my map using latitude and longitude values around a given center point. Although I see a shape on the map, I get an ellipse instead of a circle and I don't think it matches the distance specified. I intend to use this to display objects within that circle (this will be done later on once I can get the circle displaying properly, which is the reason why i need a circle not an ellipse as it should be perfectly round).

I am using a Bing Maps API. I wish to draw the circle in a given miles (distance) from the center which has been passed in through the parameter, the other variable in the parameter called miles is just holding a double value of 1D. I think the problem is to do with the way my maths is being calculated. Has anyone got a clue on how I can refine this code to calculate my miles better.

private void drawPoly(SearchLocation center, Double miles) { //amount of vertex double vertexCount = 100D;          //used by the api to carried out searches List<SearchLocation> vertices = new List<SearchLocation>(); double v = 0; double radians = Math.PI / 180D; double radiansPerDegree = Math.PI / 180D; double degreePerVertex = 360D / vertexCount; double radiansPerVertex = degreePerVertex * radiansPerDegree; var centerOfMap = center; const double degLatMiles = 68.68637156368D; double degLonMiles = Math.Cos(center.Latitude.Value) * (68.68637156368D); double milesLat = (miles * degLatMiles) / 3600; double milesLon = (miles * degLonMiles) / 3600; for (v = 0; v < vertexCount; v++) {     radians = v * radiansPerVertex;                //adds the miles from the center point and draws a circle     double centrLat = center.Latitude.Value + (milesLat * Math.Sin(radians));     double centrLon = center.Longitude.Value + (milesLon * Math.Cos(radians));     vertices.Add(new SearchLocation() { Latitude = centrLat, Longitude = centrLon }); } 
</div
           

Список ответов

1
 
vote
vote
Лучший ответ
 

Хорошо, я неправильно проводил ваш вопрос. Это должно работать:

 <код>     /// <summary>     /// Calculates the end-point from a given source at a given range (meters) and bearing (degrees).     /// This methods uses simple geometry equations to calculate the end-point.     /// </summary>     /// <param name="source">Point of origin</param>     /// <param name="range">Range in meters</param>     /// <param name="bearing">Bearing in degrees</param>     /// <returns>End-point from the source given the desired range and bearing.</returns>     public static PointLatLng CalculateDerivedPosition(PointLatLng source, double range, double bearing)     {         double latA = source.Lat * DEGREES_TO_RADIANS;         double lonA = source.Lng * DEGREES_TO_RADIANS;         double angularDistance = range / EARTH_RADIUS_M;         double trueCourse = bearing * DEGREES_TO_RADIANS;          double lat = Math.Asin(             Math.Sin(latA) * Math.Cos(angularDistance) +             Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse));          double dlon = Math.Atan2(             Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA),             Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat));          double lon = ((lonA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI;          return new PointLatLng(             lat / DEGREES_TO_RADIANS,             lon / DEGREES_TO_RADIANS);     }   

Juste Возьмите свой центр в качестве источника:

 <код> if0  
 

Ok, I've misundestood your question. This should work :

    /// <summary>     /// Calculates the end-point from a given source at a given range (meters) and bearing (degrees).     /// This methods uses simple geometry equations to calculate the end-point.     /// </summary>     /// <param name="source">Point of origin</param>     /// <param name="range">Range in meters</param>     /// <param name="bearing">Bearing in degrees</param>     /// <returns>End-point from the source given the desired range and bearing.</returns>     public static PointLatLng CalculateDerivedPosition(PointLatLng source, double range, double bearing)     {         double latA = source.Lat * DEGREES_TO_RADIANS;         double lonA = source.Lng * DEGREES_TO_RADIANS;         double angularDistance = range / EARTH_RADIUS_M;         double trueCourse = bearing * DEGREES_TO_RADIANS;          double lat = Math.Asin(             Math.Sin(latA) * Math.Cos(angularDistance) +             Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse));          double dlon = Math.Atan2(             Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA),             Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat));          double lon = ((lonA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI;          return new PointLatLng(             lat / DEGREES_TO_RADIANS,             lon / DEGREES_TO_RADIANS);     } 

Juste take your center as source :

for (int i = 0; i < 360; i++) {   vertices.Add(CalculateDerivedPosition(center, circleRadius, i)); } 
</div
 
 
0
 
vote

Чтобы предотвратить проголосы на лоскуты Sertain Я использую следующий код:

 <код> if1  

Этот код полезен для небольшого радиуса менее чем в нескольких милях.

 

To prevent elipses on sertain latitudes I use the following code:

// Function to draw circle on map:  private void DrawCircle(BasicGeoposition CenterPosition, int Radius)     {     Color FillColor = Colors.Purple;     Color StrokeColor = Colors.Red;     FillColor.A = 80;     StrokeColor.A = 80;     Circle = new MapPolygon         {             StrokeThickness = 2,             FillColor = FillColor,             StrokeColor = StrokeColor,             Path = new Geopath(Functions.CalculateCircle(CenterPosition, Radius))         };     mpBingMaps.MapElements.Add(Circle); }  // Constants and helper functions:  const double earthRadius = 6371000D; const double Circumference = 2D * Math.PI * earthRadius;  public static List<BasicGeoposition> CalculateCircle(BasicGeoposition Position, double Radius) {     List<BasicGeoposition> GeoPositions = new List<BasicGeoposition>();     for (int i = 0; i <= 360; i++)     {         double Bearing = ToRad(i);         double CircumferenceLatitudeCorrected = 2D * Math.PI * Math.Cos(ToRad(Position.Latitude)) * earthRadius;         double lat1 = Circumference / 360D * Position.Latitude;         double lon1 = CircumferenceLatitudeCorrected / 360D * Position.Longitude;         double lat2 = lat1 + Math.Sin(Bearing) * Radius;         double lon2 = lon1 + Math.Cos(Bearing) * Radius;         BasicGeoposition NewBasicPosition = new BasicGeoposition();         NewBasicPosition.Latitude = lat2 / (Circumference / 360D);         NewBasicPosition.Longitude = lon2 / (CircumferenceLatitudeCorrected / 360D);         GeoPositions.Add(NewBasicPosition);     }     return GeoPositions; }  private static double ToRad(double degrees) {     return degrees * (Math.PI / 180D); } 

This code is usefull for small radius of less than a few miles.

</div
 
 

Связанный проблема

0  DataGridTextColumn с десятичным значением, разрешить отсутствие ввода  ( Datagridtextcolumn with decimal value allow no entry ) 
Использование .NET 4.6. У меня есть DataGridTextColumn, связанный с decimal? свойства. (Мне нужна помощь от этого Ссылка , чтобы вообще работать.) Можно ...

2  Разрешения папки - некоторые или все ссылки на идентичность не могут быть переведены  ( Folder permissions some or all identity references could not be translated ) 
Я хотел бы установить папку ACL на удаленном сервере для пользователя домена, но всегда получайте следующее сообщение об ошибке: Некоторые или все ссылки н...

3  Как использовать различные настройки приложения для различных конфигураций сборки?  ( How to use different application settings for different build configurations ) 
В верхней части афоризма - вкладка (красная) свойств проекта Есть 2 серых раскрывающихся коробки (зеленые), которые я хотел бы использовать. Я хочу измен...

2  Как создать файл XPS с веб-страницы, используя C #?  ( How to create xps file from web page using c ) 
Как создать файл XPS с веб-страницы, используя C #? Любые идеи? ...

2  Получение G-WAN для работы с моно  ( Getting g wan to work with mono ) 
Я следовал инструкциям на сайте G-WAN FAQ и прочитал руководство, но я не могу получить G-WAN, чтобы «увидеть» мономонтаж на мою установку Debian 6 (x64). Я...

1  C # WPF Toolkit DataGrid - Группа внутри группы?  ( C sharp wpf toolkit datagrid group inside group ) 
У меня есть группа, в которой есть элементы внутри нее, и я бы хотел, чтобы эта группа была подгруппа. <Сильные> Основные группы : «Windows», «Linux», «MAC»...

2  Dotnetzip - чтение на память  ( Dotnetzip reading to memory ) 
Я собрал быстрый тест, используя библиотеку Dotnetzip, которая открывает ZIP-файл, полный файлов .bmp и преобразует их в формат .jpg. До этого я писал все ф...

2  Компиляция страницы ASPX не удается  ( Aspx page compilation fails ) 
Мы разрабатываем веб-приложение, которое позволяет администраторам загружать плагины. Все плагины хранятся в специальной папке вне корня приложения (скажем, C...

1  Получите только имя от LDAP в ASP.NET C #  ( Get just the name from ldap in asp net c sharp ) 
Я хочу диаметровать все имена, которые совпадают с именем, имеющим имя с именем пользователя с сервера каталогов, используя LDAP и связывают его к виду сетки....

4  Какую книгу на TDD для C # с лечением издевателей  ( What book on tdd for c sharp with treatment of mocks ) 
Можете ли вы помнить книгу о тестировании подразделения и TDD для C #, по крайней мере, некоторое лечение отдельных объектов? Я видел эту Вопрос Но, похож...

770  Файл метаданных '.dll' не может быть найден  ( Metadata file dll could not be found ) 
Я работаю над проектом WPF, C # 3.0, и я получаю эту ошибку: <код> Error 1 Metadata file 'WORK=- ToolsVersionManagementSystemBusinessLogicLayerinDebug Busi...

1  Как изменить координаты текста на странице PDF из нижнего левого слева  ( How to change the coordinates of a text in a pdf page from lower left to upper l ) 
Я использую pdfbox и itextsharp dll и обработаю PDF. Так что я получаю текстовые координаты текста в прямоугольнике. Координаты прямоугольника извлекаются с п...

157  Попытался прочитать или писать защищенную память. Это часто является признаком того, что другая память повреждена  ( Attempted to read or write protected memory this is often an indication that ot ) 
Я надеюсь, что кто-то может просветить меня относительно того, что может вызвать эту ошибку: попытался прочитать или писать защищенную память. Это часто яв...

0  Внедрить свойство с пользовательским атрибутом  ( Implement property with custom attribute ) 
Может быть, я получаю концепцию пользовательских атрибутов не так, но я подумал, что это должно быть что-то, что было бы возможно: У меня есть класс со стро...

0  Неправильный выход LINQ сумма  ( Wrong output linq sum ) 
У меня есть эти данные ниже и сумма запроса LINQ. Но я не знаю, почему его вывод не то, что я ожидал. <Сильные> данные на DatateFaled - Tourndays - отме...

Связанный проблема

0  DataGridTextColumn с десятичным значением, разрешить отсутствие ввода 
2  Разрешения папки - некоторые или все ссылки на идентичность не могут быть переведены 
3  Как использовать различные настройки приложения для различных конфигураций сборки? 
2  Как создать файл XPS с веб-страницы, используя C #? 
2  Получение G-WAN для работы с моно 
1  C # WPF Toolkit DataGrid - Группа внутри группы? 
2  Dotnetzip - чтение на память 
2  Компиляция страницы ASPX не удается 
1  Получите только имя от LDAP в ASP.NET C # 
4  Какую книгу на TDD для C # с лечением издевателей 
770  Файл метаданных '.dll' не может быть найден 
1  Как изменить координаты текста на странице PDF из нижнего левого слева 
157  Попытался прочитать или писать защищенную память. Это часто является признаком того, что другая память повреждена 
0  Внедрить свойство с пользовательским атрибутом 
0  Неправильный выход LINQ сумма 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.