Ответы пользователя по тегу Программирование
  • Адреса указателей?

    Nipheris
    @Nipheris Куратор тега C++
    Потому что указатели - прежде всего такие же переменные, как и любые другие (это очень важно понимать). Второе выведенное значение - это значение переменной b, и не особо важно, указатель это или нет (в нашем случае - да, указатель, и поэтому выведенное значение переменной b - некоторый адрес). Третье выведенное значение - это АДРЕС переменной b, и не имеет значения, что за тип у переменной b. Вы можете объявить int b или float b, и получите аналогичный результат.

    Вот что является отличительным моментом указателя - это как раз таки первое выведенное значение, а точнее, сама возможность его вывести. Для указателей (а также для любых пользовательских типов, реализующих operator*) доступна операция разыменования. Это дает возможность взять значение переменной b, интерпретировать его как адрес, а затем, в свою очередь, залезть в память по этому адресу и получить значение уже оттуда. В данном случае можно утверждать, что по адресу 0x011CD1C0 находится значение 66 (если его интепретировать соответственно типу указателя).
    Ответ написан
    1 комментарий
  • Как извлечь значения из переменной, с помощью регулярки С#?

    Nipheris
    @Nipheris Куратор тега C#
    ^(?<text>[^:]*):(?<text2>[^:]*):(?<text3>[^:]*)$

    Не знаю, по какому источнику вы смотрели, в MSDN все предельно понятно: https://msdn.microsoft.com/en-us/library/bs2twtah(...
    Ответ написан
    2 комментария
  • Как определить координаты тела, если оно движется по эллипсу?

    https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%BB%D...

    Отличие от окружности только в различающихся радиусах-коэффициентах a и b.
    Ответ написан
    Комментировать
  • Как найти разницу двух чисел в массиве рекурсивно?

    Навскидку:
    const D = 10
    int N = ...
    int a[N] = ...
    
    find(i, j, N):
    	d := a[j] - a[i]
    	if d = D then
    		return (i, j)
    	else if d < D then
    		if j + 1 == N then
    			return nil
    		else
    			return find(i, j + 1, N)
    		end
    	else if d > D then
    		if i + 1 == N - 1 then
    			return nil
    		else
    			return find(i + 1, j, N)
    		end
    	end
    
    find(0, 1, N);

    Сложность по идее O(2n). Вообще не очень красиво для рекурсивной реализации, но вроде рабочий вариант.
    Вторую задачу - сами.
    Ответ написан
    5 комментариев
  • Создание свого аудиоформата, с чего начать?

    С написания диссертации по обработке сигналов. Ну или со знакомства с человеком, который пишет диссертацию по обработке сигналов.

    Почему? Потому что чтобы превзойти существующие решения хотя бы в какой-то нише (напр., приемлемое качество речи при очень низком битрейте, или lossless-кодирование с высокой степенью сжатия) нужно хорошо поработать. Потом еще провести десяток-другой серьезных экспериментов, чтобы доказать преимущества вашего подхода в конкретных случаях (см. выше). Тогда в вашем кодеке будет реальная ценность, и вас, возможно, услышат серьезные люди.
    А "для себя" - Stalker_RED уже все сказал: изучите теорию, и существующие решения. Узнаете столько всего, что с вероятностью 98% перехочется делать свое. Зато будете знать, как делают другие.
    Ответ написан
    Комментировать
  • Необходим найти совпадающие участки в двух битовых массивах, как это сделать?

    Наибольшая общая подпоследовательность

    Прям как вам надо.

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

    UPD: Вот еще точнее: Наибольшая общая подстрока - для случая, когда разрывов в цепочке быть не должно ( Mrrl правильно заметил, что в подпоследовательности они могут быть).
    Ответ написан
    3 комментария
  • Есть ли в области системного программирования такие задачи, для которых целесообразно только использование ассемблера?

    абсолютно все

    абсолютно все не напишите, тот же SYSENTER компилятор за вас не сделает. По большому счету большая часть кода - на Си (структуры данных, алгоритмы), а сугубо низкоуровневые вещи - например, переключение стека - делается ассемблерными вставками. Ну или вывод в порт - не представляю как это сделать в рамках Си.
    Ответ написан
  • Что должен знать junior С#?

    Nipheris
    @Nipheris Куратор тега C#
    корпоративные приложения

    Поучите голый ADO.NET и какую-нибудь ORM-ку, да хотя бы EF. Еще можете хотя бы начать ASP.NET, вероятность попасть на него на первой работе достаточно высокая.

    финансы, банковская сфера

    Подтяните теорию по реляционным БД. Ведь какие финансы без транзакций!) Вы должны хотя бы знать о таких понятиях, как изоляция транзакций, представлять в общих чертах как на SQL можно сделать какую-нибудь выборку с агренированием. Никто конечно в здравом уме не даст джуниору непосредственный доступ к сколь-либо значащим данным, отражающим реальные денежные балансы, но ваша осведомленность пойдет вам на пользу, иначе рискуете клепать интерфейсики ближайшие несколько лет. А, ну да, выясните, почему нельзя вот так считать проценты по кредиту:
    float interestRate = 0.13 // ставка
    float interestSum = interestRate * sum;


    геймдев

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

    И еще для всех направлений: станьте более-менее самостоятельным в вопросах деплоя. Вы должны в общих чертах представлять, что находится внутри дотнетовской сборки, как работает версионность и что может пойти не так. Ну и про NuGet я надеюсь вы уже знаете.
    Ответ написан
    1 комментарий
  • Как объяснить девушке что такое "некрасивый" код?

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

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

    Молодые люди с ясными и последовательными мыслями, насколько мне известно, пользуются успехом у девушек.
    Ответ написан
    2 комментария
  • C# заменит ли Java?

    Oxoron ну что тут сказать навскидку...
    Я всегда считал .net допиленной java-платформой. Не то, чтобы в дотнете прям нереальные невероятные новшества, но все же некоторые вещи были обдуманы еще раз. Например, очень важным считаю разделение на reference и value типы. Правда, ИМХО, MS не довела идею до победного конца (слишком много технических вопросов нужно учитывать при выборе struct vs class), но все равно шаг очень правильный.
    Плюс, считаю важным отсутствие корреляции между логическим структурированием библиотек (по неймспейсам) и физическим (по сборкам). На каждом уровне должны приниматься отдельные решения насчет того, что куда класть.
    Еще одним преимуществом (нивелированным на данный момент) была изначальная ориентация .net на мультиязычную поддержку. Сейчас конечно JVM-языков навалом, но раньше это все-таки смотрелось киллер-фичей .net. Особенно поддержка "склеивающих" языков, таких как C++/CLI, которые позволяли интегрировать уже существующие компоненты с .net-приложениями. Дотнет изначально не был платформой в себе, разработчикам давали массу инструментов для интеграцией с COM и native-кодом. Ну и само собой managed-языки в приличном количестве, вон F# уже довольно давно подтянулся как официально (!!) поддерживаемый.

    А вообще конечно изначальным преимуществом .net были именно языки. Я думаю даже самые ярые джависты со мной согласятся, что с момента выпуска C#, язык Java развивается догоняющим образом. Можно опять сказать, что есть Scala, но тогда нужно учесть, что C# изначально был визитной карточкой платформы с момента ее появления. Ну и самое главное - инструменты. В мире Java достаточно хороших IDE, но уровень взаимоподдержки Студии и .net насколько мне известно пока не достигнут.

    И тут мы выходим на стандартное основное преимущество решений от MS - максимальная "готовность" и интеграция продуктов. К сожалению последние года 3 в Джаву не совался, но знакомые не раз говорили, что с отсутствием знаний об обеих платформах им гораздо легче было поднять hello-world веб-сайт (!) на asp.net в студии, нежели на том же Spring. Так или иначе, это фактор.

    Теперь библиотеки. Конечно, в мире джава их огромное количество. Я думаю и сегодня их значительно больше, чем в дотнет. Две либы в моем текущем проекте - NHibernate и NetTopologySuite - это порты с джавовских либ. Джава рулит на сервере. Про..аная Майкрософтом настоящая кроссплатформенность .net не давала ему потеснить джаву. Сейчас конечно это усиленно исправляется - в дотнете уже наступило перерождение после массовых релизов в open-source, переделанного asp.net, и появления DNX. По сути теперь .net официально поддерживается на *nix - системах. Это конечно надо было сделать намного раньше, но и сейчас этому рады.
    NuGet прекрасно справляется со своими задачами, более тесная интеграция в билд-процесс в DNX только улучшит процесс взаимодействия с ним.

    Ну и последнее - разработка UI. Все что есть в Java-мире (JavaFX, Java3D, Swing) это совсем не то. Windows Forms был отличным аналогом Дельфийских компонентов для UI, WPF в свое время вышиб немало дверей своим появлением. Если б он еще и развивался как подобает... Да, конечно, на джавовских технологиях вы напишите кроссплатформенную вещь, но она будет одинаково чужеродно смотреться и на винде, и в линуксовых desktop-средах. А людям в enterprise не особо нужна кроссплатформенность в UI - им намного важнее аккуратный привычный интерфейс, в том числе на Винде. Сейчас WPF может потеснить только современный Qt. Выбирая сегодня UI для десктопа, я бы выбирал между WPF и Qt, про джаву бы даже не подумал (да, я считаю что сегодня далеко не все можно и нужно пихать в браузер на тормозной JS. Весь новомодный неповоротливый софт, написанный с использованием Atom-а, меня удручает).
    ПРАВКА: посмотрел последние демки по JavaFX. В общем-то неплохо, осталось только дождаться хорошего роста коммьюнити и надеяться что не будет проблем с производительностью в сложных приложениях.

    Сколько тут преимуществ в штуках, посчитайте сами. Самый главный вывод - мало у кого возникает желание переходить на другую платформу просто потому, что обе сейчас очень хорошо развиты, и в обоих есть что поизучать, в обоих есть клиент и сервер, куча библиотек. Изучив один стек, никто не будет тратить время на другой, в этом просто нет смысла. Если кто-то и переучивается, то ради хорошей зарплаты: в банках и прочих страховых джава чуть популярнее, и за нее больше платят, процентов на 20.

    P.S. Да, тут кстати пишут что игродельство на C# достигло серьезного уровня. Я 3d делал и делаю на C++, поэтому тут пусть кто-нибудь другой прокомментирует.
    Ответ написан
    1 комментарий
  • Как задать массив с целыми и вещественными числами?

    Nipheris
    @Nipheris Куратор тега C++
    Как задать массив, в который можно записать и целые и вещественные числа?
    boost::variant<int, double>

    Только сначала убедитесь, что вы понимаете, что делаете и чего хотите.

    Олег Цилюрик
    C++ типизированный язык, и в массиве могут быть элементы только одного типа;

    Совершенно верно, и этот тип может быть суммой нескольких других типов (суммой в смысле суммы множеств допустимых значений).
    Ответ написан
    Комментировать
  • Правильная разработка программного обеспечения!?

    Nipheris
    @Nipheris Куратор тега C#
    "Нормально ли создавать в каждом классе куча экземпляров других классов?", "Не режет ли потом данная программа по производительности ПК с такими количеством уровнями классов?"


    А вы поймите, что если вас беспокоит приведеннный вами код, вам надо не о сколько о классах думать, и не о производительности, сколько о функциях и методах. Зелим Бельтоев уже хорошо намекнул вам об этом, я скажу еще раз словами: то, что ОБЪЕКТОВ много и между ними сложные связи - это НОРМАЛЬНО. Самое главное, что у вы должны уметь ограничивать - сложность и объем связей в КОНКРЕТНОМ участке кода. Пока вы понимаете, ЧТО у вас написано в конкретном методе, и КАК это себя ведет (причем, это понимание не расходится с рельностью) - вы все делаете правильно. Это важнейший критерий. Производительность это тоже фактор, но я даже не могу себе представить, насколько сложную структуру классов нужно изобрести, чтобы она реально мешала тому же CLR исполнять код. Реально узкие места по пр-ти возникают в алгоритмах с высокой алгоритмической сложностью, таких мест обычно мало (если они вообще есть, в бизнес-приложениях в 99% случаев все упирается в IO, или в необходимость побольше кэшировать на клиенте), и они целенаправленно оптимизируются.
    Ответ написан
    8 комментариев
  • Какая разница в асинхронных методах?

    Nipheris
    @Nipheris Куратор тега C#
    Разница в том, что await можно использовать только в async-методе, и его использование подразумевает, что компилятор превратит метод в сопрограмму, и в том месте, где стоит await, его выполнение можно будет приостановить и переключиться на что-то еще.

    Использование Result остановит ваш поток до тех пор, пока таск не завершится и не вернет результат. Но Result можно использовать и в обыкновенном методе, не только async (в async методе его использовать абсолютно бессмысленно).

    Кроме того, использование Result влечет за собой неочевидные эффекты в виде возможности дедлоков и усложняет обработку исключений (т.к. Result всегда кидает AggreagteException, в который оборачивается исключение, брошенное внутри таска), подробнее смотрите тут stackoverflow.com/questions/24623120/await-on-a-co...

    Как первый ответ отвечает на ваш вопрос я не понимаю)
    Ответ написан
    6 комментариев
  • ClassName::functionName или objectName.functionName?

    Nipheris
    @Nipheris Куратор тега C++
    Отвечу без догадок.
    > Я понимаю что cout << objectName.functionName означает, что мы выводим возвращаемые данные функции , которая принадлежит объекту класса(оперирует данными объекта).
    Это хорошо соответствует истине, добавить в общем-то нечего.

    > Но вот почему мы иногда использует cout << ClassName::functionName вместо первого варианта я не могу понять...
    "::" это оператор расширения области видимости. В языке C++ различные сущности могут быть объявлены "внутри" других сущностей. Например, функции внутри классов, как в вашем случае - тогда они становятся методами. Классы, функции и переменные могут объявляться внутри namespace-ов. Классы могут объявляться внутри других классов. Классы даже могут объявляться внутри определения функций.
    Во всех этих и других случаях, можно говорить о двух именах сущности - коротком, которое уникально в рамках родительской сущности, и о полном, по которому к сущности можно обратиться из любого места в программе. Например,

    namespace MyLibrary {
        namespace UI {
            class Widget {
             ///
            };
            class Controller {
            private:
                Widget *widget; // Здесь Widget будет видно по короткому имени
            };
        }
    }
    
    namespace App {
      MyLibrary::UI::Widget *w; // А вот здесь уже нужно использовать полное
    }

    Это правило касается всего - и классов, и функций, и переменных. И вот как раз для построения полного имени и нужен оператор "::". Грубо говоря, он "открывает" указанную вами сущность и после него вы можете указать имя вложенной сущности. MyLibrary::UI::Widget - открыли неймспейс MyLibrary, в нем взяли и открыли неймспейс UI, в нем взяли сущность Widget. В нашем случае Widget это класс, поэтому мы можем использовать его в качестве типа, например объявить указатель на его объект. Если бы у нас была переменная mainWidget в том же UI, мы бы могли написать так:
    MyLibrary::UI::mainWidget = new MyLibrary::UI::Widget(); // создали объект виджета в куче и поместили указатель на него в переменную-указатель


    С точкой тут вот в чем дело. По умолчанию функции внутри классов считаются методами ОБЪЕКТА (экземпляра этого класса), и, как вы правильно сказали, оперируют с данными объекта, а значит они НЕ МОГУТ быть вызваны без указания того объекта. Иными словами, они не самостоятельны, для их вызова всегда нужно указывать объект, с которым метод будет работать. Можете представлять себе, что у всех методов экземпляра есть неявный параметр this, который, хоть и не пишется в списке, тем не менее всегда присутствует, и его значение надо задавать. Оператор точка - это и есть способ задать значение "this" - т.е. указать, для какого объекта вызывается метод.

    Совсем другое дело - static-методы. По сути это самостоятельные функции, просто объявлены внутри класса, и имеют доступ к его private-сущностям. Поэтому для их вызова достаточно указать полное имя, используя оператор "::", например Widget::create или MyLibrary::UI:Widget::create, что в принципе одно и то же. Более полная запись нужна, когда вы находитесь в другой области видимости, и просто "не видите" нужный идентификатор. Или же если у вас в текущий области НЕСКОЛЬКО идентификаторов с одинаковым именем (конфликт имен), и компилятору необходимо однозначно понять, о какой сущности вы говорите.

    Касательно случая, который вам непонятен - про использование :: в составном имени метода - тут все просто. Т.к. вы собираетесь не ВЫЗВАТЬ метод, а дать его ОПРЕДЕЛЕНИЕ, вам не нужна точка, т.к. точка это синтаксис вызова метода для конкретного объекта. Вам лишь нужно построить ПОЛНОЕ имя для метода, находящегося внутри класса, чтобы компилятор понял, ЧЕЙ код вы будете писать в фигурных скобках. А полное имя строится с помощью двоеточия, поэтому и получается ClassName::methodName { код метода }. Просто methodName вы написать не можете, т.к. в cpp-файле вы находитесь УЖЕ НЕ ВНУТРИ определения КЛАССА, и компилятор посчитает, что вы объявляете и описываете совсем другую, свободную функцию methodName, совершенно не имеющую отношения к методу methodName в классе ClassName.

    Есть некоторые интересные особенности у "::", например когда слева от него ничего нет. Это значит, что вы обращаетесь к глобальной области видимости. Это позволяет, например, различать глобальную функцию, и функцию с таким же именем, определенную в вашей области видимости. Это можно в приличной книжке все прочесть.

    Если остались вопросы - задавайте. Запомнить проще всего так: точка - это обращение к члену объекта структуры или вызов метода (т.е. слева от точки всегда стоит объект), а "::" - это способ составления ИМЕНИ какого-либо элемента вашей программы - класса, функции, метода, переменной и т.д.
    Ответ написан
    1 комментарий
  • Как вернуть файлы?

    Чет так и не понял в чем проблема.. Если папка скрытая - то включи отображение скрытых папок, если к папке нет доступа, то открой командную строку в этой папке, и
    cacls *.* /T /G ALL:F
    Ответ написан
    3 комментария
  • Какие методы/библиотеки/технологии использовать в web-проекте?

    > в БД через каждый цикл и соответственно в начале следующего его разворачивая, но это уж как-то изощренно получается.
    Ничего изощренного в этом нет, по крайней мере если хотите это все реализовать на PHP.
    Паттерн применения этого языка такой, что лучше таки давать скриптам быстро отрабатывать ценой необходимости сохранения состояния. Дополнительными плюсами автоматически идут:
    масштабирование (один сервер может сохранить состояние, а уже другой - извлечь) и надежность - упавший скрипт не убьет игру.
    В качестве БД советую взять Redis или Mongo, можно даже в паре, РСУБД для сохранения состояния игры будет малополезным решением, хотя будет гораздо полезнее для сохранения и обработки статистики, если таковая планируется.
    Ответ написан
    2 комментария
  • С++. Работа с графикой. Когда начинать?

    Nipheris
    @Nipheris Куратор тега C++
    > Возможно перед работой с любой библиотекой нужно знать "основу" в самом языке?
    Вполне логично, что язык надо знать, вопрос - насколько полно (особенно это касается C++, полностью его знают только разработчики стандарта и компиляторов).
    OpenGL (который я бы советовал вам посмотореть) это по сути Си-шная либа, поэтому с ней проще - выучите что такое функции и указатели, разберитесь с базовыми типами данных и особенностями операций (чтобы не удивляться, почему 3 / 2 = 1, а 3.0 / 2.0 = 1.5), и можете пробовать. Из общего развития - матричная алгебра, особенности компьютерной арифметики (числа с плавающей точкой и т.д.). Ну и сама "графика" - устройство графического конвейера, типы рендеринга (фотореалистичный/реального времени), этапы рендеринга, и т.д.
    Отдельная задача - уметь настроить компилятор и IDE для того, чтобы все, что использует OpenGL, нормально компилилось, но это вы и в гугле найдете.
    Ответ написан
    Комментировать
  • Нормализация БД. Зло или добро?

    Видите ли в чем дело - нормализация это не столько для СУБД и не для приложения ее использующего. Это больше для вас, для разработчика (БД и/или приложения), и для целостности и согласованности данных.

    Безусловно, в продакшене идеальна та БД, структура которой позволяет выполнить наиболее частые (или тяжелые) запросы к БД максимально экономно с точки зрения аппаратных ресурсов (меньше чтений блоков с диска, меньше джоинов, наиболее эффективное использование индексов), и такая структура вовсе не обязательно должна быть в высокой нормальной форме. Однако, есть и другой вопрос - какая БД идеальна для вас, как для разработчика? Избыточность в базе - потенциал для ошибок. Если какую-либо информацию нужно обновить в двух местах (например, цену товара в чеке и общую стоимость заказа) - вы всегда имеете возможность где-то забыть это сделать.

    Именно по причине несовпадения двух структур БД: максимально нормализованной, удобной для разработчика/проектировщика, и оптимизированной для выполнения запросов - стандартный цикл проектирования БД включает в себя этап нормализации до опредленного уровня (хотя бы до 3нф), и последующей денормализации для ускорения конкретных запросов (также, как и построение необходимых индексов). Т.к. денормализация требует усложнения логики работы с базой (те самые обновления в нескольких местах), эту логику (чаще всего это хранимки или триггеры, реже - на стороне приложения) нужно реализовывать максимально аккуратно и формально. Это похоже на написание кода на высокоуровневом языке и последующая его компиляция под конкретную платформу с максимальными оптимизациями. Единственное важное отличие - особенности целевой платформы известны заранее, и компилятор, учитывающий эти особенности, можно написать один раз, а вот особенности работы БД в каждой задаче - свои, поэтому в каждом случае нужно проводить работу по оптимизации БД с нуля.

    Нужно отметить, что в современных системах денормализация схемы - не единственный и не всегда лучший способ повышения производительности. Кэширование часто используемых данных в каком-нибудь memcached - иногда проще и эффективнее, чем денормализация БД и поддержка ее согласованности.
    Ответ написан
    Комментировать
  • Картография и программирование?

    Не знаю, что вы имеете в виду под "перейти в область", если вы программист, то вам стоит не "переходить", а специализироваться, если вам это интересно. Я это говорю как человек, который сейчас плотно занимается ГИС-системами - опыта в этом направлении пока маловато, но также как и у вас - есть большой интерес и обоснованное ощущение полезности разрабатываемых проектов (в противоположность многим другим разработкам в IT). Поэтому просто продолжайте программировать и постигайте карты, начиная с простейших вещей. Вы много с чем столкнетесь, для меня самым сложным пока были системы координат и неевклидова геометрия с ними связанная. Собственно, в этом и вся геодезия.
    При всем этом я не берусь называть себя геодезистом, я по прежему программист, ГИС это скорее специализация. Ничего нереального в вашей задумке нет, область большая и востребованная (особенно сейчас, когда наконец проснулись отечественные информационные системы, желающие перевести побольше дореволюционных бумажных сведений в удобоваримый вид).
    Высшее образование вам понадобится (это по закону так), только если вы захотите плотно заняться именно картографическими данными - межеванием, измерениями, подготовкой документов и прочими делами. Лично мне это пока не нужно было.
    Могу вам накидать кучу аббревиатур и технологий, с которыми успел столкнуться за 3+ лет (я дотнетчик, поэтому и набор соответствующий):
    1) PosgtreSQL + PostGIS - некоторое врпмя сидели на MySQL, но потом перекатили проект сюда, возвращаться и не думали, все-таки это стандарт де-факто в ГИС СУБД
    2) NetTopologySuite - дотнетовский клон JTS - библиотеки, реализующей основные примитивы и алгоритмы обработки геометрии (точка, линия, полигон, поиск пересечений, касаний, расчет площади и т.д.) - пока хватает за глаза;
    3) NHibernate в комбинации с NHibernate.Spatial - ORM №1 для нас. Начинали разработку, когда EF еще пешком под стол ходил, но и сейчас я бы выбрал ее, очень мощная либа, особенно с плагином Spatial для поддержки маппинга Geometry-полей
    4) SharpMap - движок карт. Качество среднее, но с учетом того, что он некоммерческий (LGPL), то вполне сойдет.
    5) QGIS - гис-система, важный инструмент, помимо Visual Studio.
    Это наш стек. Ну а вообще можете еще погуглить: WFS/WMS, GeoJSON/TopoJSON, GeoServer (пока не пользуемся, подключим, если понадобится WFS-сервер).
    Ответ написан
    Комментировать